mysql-从每个id中选择一个随机行
Posted
技术标签:
【中文标题】mysql-从每个id中选择一个随机行【英文标题】:mysql-select a random row from each id 【发布时间】:2020-09-23 05:45:51 【问题描述】:我的数据库中有一个表,它有 2 列:id
和 color
。每个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中选择一个随机行的主要内容,如果未能解决你的问题,请参考以下文章