首页 > 解决方案 > mysql-从每个id中选择一个随机行

问题描述

我的数据库中有一个表,它有 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

标签: mysqlsqlselectsubquerygreatest-n-per-group

解决方案


你可以试试:

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 *with 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;

推荐阅读