我有一个带有Items表的数据库,看起来像这样:
Items
id name category (int)
有数十万条记录。每个item可以在7个不同categories的categories表之一中,对应于一个表:
item
categories
id category
我想要一个从每个类别中选择1个随机项目的查询。解决这个问题的最佳方法是什么?我知道使用Order By rand()和LIMIT 1用于类似的随机查询,但是我从未做过这样的事情。
Order By rand()
LIMIT 1
此查询以随机顺序返回加入类别的所有项目:
SELECT c.id AS cid, c.category, i.id AS iid, i.name FROM categories c INNER JOIN items i ON c.id = i.category ORDER BY RAND()
要将每个类别限制为一个类别,请将查询包装在 partial中 GROUP BY:
GROUP BY
SELECT * FROM ( SELECT c.id AS cid, c.category, i.id AS iid, i.name FROM categories c INNER JOIN items i ON c.id = i.category ORDER BY RAND() ) AS shuffled_items GROUP BY cid
请注意,当查询同时具有GROUP BYand ORDER BY子句时,将在排序之前执行分组。这就是为什么我使用了两个查询的原因:第一个对结果进行排序,第二个对结果进行分组。
ORDER BY
我了解此查询不会赢得任何比赛。我愿意提出建议。