mysql - mysql-从每个id中选择一个随机行
问题描述
我的数据库中有一个表,它有 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
解决方案
你可以试试:
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;
推荐阅读
- sap-ase - Sybase ASE 12.5.2 服务器配置错误 208
- haskell - 具有头部功能的 Haskell 懒惰问题
- javascript - 如何在带有nodejs的forloop中使用mysql查询
- java - 即使类是公共的,子类的Java错误访问方法
- javascript - 基于分层数据的 TR id 的条件总和
- asp.net-mvc - 从模型返回sql查询数据到控制器
- java - 递归计数
- node.js - Node.js & Express:如果服务器正在运行,则无响应
- flutter - BlocProvider 在继承的小部件中不可用
- sql - SQL 舍入到小数点后 2 位问题