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

标签 mysql sql random sql-order-by

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

我知道这个查询不会赢得任何比赛。我乐于接受建议。

关于MYSQL 从每个类别中选择一个随机记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14245275/

相关文章:

mysql - 按日期时间sql合并两个表

javascript - 从 JavaScript 数组中获取随机项

mysql - 使用 MySQL 分块删除

php - 使用预准备语句将数据插入数据库时​​出错

php - 使用在线 PHP 文件设置对 DB 的本地调用 - 连接问题

mysql - 如何使用第一个相关日期连接两个表?

sql - 未明确指定列名/列的 PostgreSQL 列到行

c - 预测由 C (glibc) rand() 生成的下一个数字

c - 六个数字组合的随机数生成

Mysql 程序。更新并选择