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

djt*_*djt 6 mysql sql random sql-order-by

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

id
name
category (int)
Run Code Online (Sandbox Code Playgroud)

有几十万条记录.每个都item可以是7个不同的一个categories,对应一个categories表:

id
category
Run Code Online (Sandbox Code Playgroud)

我想要一个从每个类别中选择1个随机项的查询.什么是接近它的最佳方式?我知道使用Order By rand()LIMIT 1类似的随机查询,但我从来没有做过这样的事情.

Sal*_*n A 5

此查询以随机顺序返回连接到类别的所有项目:

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()
Run Code Online (Sandbox Code Playgroud)

要将每个类别限制为一个,请将查询包装为部分 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
Run Code Online (Sandbox Code Playgroud)

请注意,当查询同时具有GROUP BYORDER BY子句时,将在排序之前执行分组.这就是我使用两个查询的原因:第一个对结果进行排序,第二个对结果进行分组.

我知道这个查询不会赢得任何比赛.我愿意接受建议.