场景:(我正在使用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/

10-13 08:10