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

时间:2020-06-04 09:29:23

标签: mysql sql select subquery greatest-n-per-group

我的数据库中有一个表,该表有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 个答案:

答案 0 :(得分: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;
相关问题