一尘不染

MYSQL从每个类别中选择一个随机记录

mysql

我有一个带有Items表的数据库,看起来像这样:

id
name
category (int)

有数十万条记录。每个item可以在7个不同categoriescategories表之一中,对应于一个表:

id
category

我想要一个从每个类别中选择1个随机项目的查询。解决这个问题的最佳方法是什么?我知道使用Order By rand()LIMIT 1用于类似的随机查询,但是我从未做过这样的事情。


阅读 592

收藏
2020-05-17

共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

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子句时,将在排序之前执行分组。这就是为什么我使用了两个查询的原因:第一个对结果进行排序,第二个对结果进行分组。

我了解此查询不会赢得任何比赛。我愿意提出建议。

2020-05-17