mysql-从每个id中选择一个随机行

Posted

技术标签:

【中文标题】mysql-从每个id中选择一个随机行【英文标题】:mysql-select a random row from each id 【发布时间】:2020-09-23 05:45:51 【问题描述】:

我的数据库中有一个表,它有 2 列:idcolor。每个id 可能有多个具有不同color 值的行。比如:

id     color
--------------
1      black
1      white
1      green
2      yellow
3      red
3      black

我只想为每个id 选择一行,但是是随机的。我已经尝试过使用两个选择查询,但它总是返回每个 id 的第一行。什么问题?!

SELECT * FROM (SELECT * FROM collections ORDER BY RAND()) AS a
GROUP BY id

【问题讨论】:

【参考方案1】:

你可以试试:

select t.*
from t
where t.color = (select t2.color
                 from t t2
                 where t2.id = t.id
                 order by rand()
                 limit 1
                );

为了提高性能,您可以尝试使用(id, color) 上的索引。

您的代码根本不应该工作。它使用select *group by——这意味着你有未聚合的列。那应该是编译时错误。

编辑:

哈哈。当然,上面有一个问题。为每一行调用子查询,使每一行都有机会出现在结果集中。叹。有时代码不会做我想做的事。一种解决方案是播种随机数生成器。这是“任意”而非“随机”——每次运行都会得到相同的值:

select t.*
from t
where t.color = (select t2.color
                 from t t2
                 where t2.id = t.id
                 order by rand(concat(t2.id, t2.color))
                 limit 1
                );

如果你没有太多颜色,你可以使用group_concat()技巧:

select t.id,
       substring_index(group_concat(color order by rand()), ',', 1)
from tA quick and dirty solution is to seed the random number generator:
group by id;

【讨论】:

谢谢。但是对于某些 id,它返回不止一行,并且每次运行它时,它都会返回不同数量的行作为结果 @Soheil 。 . .仅当 color 有多于一行时,这将返回多行。您的样本数据没有此类示例,因此这符合您提出的问题。如果出现问题,您可以使用主键代替 color(您的示例数据没有)。 不,颜色值在整个表格中是唯一的。但此查询仍然为某些 id 返回多行 @Soheil 。 . .啊。说明为什么它不起作用。

以上是关于mysql-从每个id中选择一个随机行的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 从大表中选择随机行

使用连接时为每个不同的字段值选择随机行

从mysql中的大表中快速选择随机行

MySQL 从 600K 行中快速选择 10 个随机行

使用 sql (Hive) 中的条件为每个 ID 选择随机行

sql [sql]从每个类别中选择1个随机行