场景:(我正在使用MySQL)
这是我的架构:
CREATE TABLE so_time_diff(
OwnerUserId int(11),
time_diff int(10)
);
有许多OwnerUserId,每个OwnerUserId具有许多time_diff值。
我想选择1000个随机不同的OwnerUserId,并为每个OwnerUserId仅选择一个随机的time_difference值。
我已经从其他地方获得了1000个不同的OwnerUserId,并存储在另一个表中:
mysql> create table so_OwnerUserId select distinct(Id) as OwnerUserId
from so_users order by RAND() limit 1000;
我写了以下查询:
select @td := time_diff from so_time_diff sotd, so_OwnerUserId soui
where sotd.OwnerUserId = soui.OwnerUserId group by sotd.OwnerUserId
order by rand() limit 1;
这似乎没有实现我想要的。它显然只返回一行。但是我想要每个OwnerUserId的time_diff集合中有一个随机行。有人可以指导我如何做到这一点吗?
仅供参考-数据集巨大-约有5600万条记录。因此,我正在寻找最佳查询。
任何帮助表示赞赏。
谢谢!
最佳答案
一种方法是使用相关子查询。这不是一种非常有效的方法,因为将对外部表中的每一行执行该子查询,如果so_OwnerUserId中有1000行,则将是1000次。
SELECT r.OwnerUserId
, ( SELECT d.time_diff
FROM so_time_diff d
WHERE d.OwnerUserId = r.OwnerUserId
ORDER BY RAND()
LIMIT 1
) AS random_time_diff
FROM so_OwnerUserId r
对于任何类型的性能,您都需要在
OwnerUserId
表上具有前导列so_time_diff
的索引。更好的是,覆盖指数... ON so_time_diff (OwnerUserId, time_diff)
(对于InnoDB,如果这些是表中仅有的两列,则希望将其作为集群键。)
关于mysql - 从随机选择的用户ID的集合中选择随机行[mysql],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23416688/