我有一个带有 Items
表的数据库,看起来像这样:
id
name
category (int)
有几十万条记录。每个 item
可以属于 7 个不同的 categories
之一,对应于一个 categories
表:
id
category
我想要一个从每个类别中选择 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()
要将每个类别限制为一个,请将查询包装在部分 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 BY
和 ORDER BY
子句时,分组在排序之前执行。这就是我使用两个查询的原因:第一个查询对结果进行排序,第二个查询对结果进行分组。
我知道这个查询不会赢得任何比赛。我乐于接受建议。
关于MYSQL 从每个类别中选择一个随机记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14245275/