我有一张类似于此的桌子:http://sqlfiddle.com/#!2/8c877
举个例子,让我们简单地说,这是一个由“用户”完成的“活动”表。
从表中每一个user_id选择一个随机行的最有效方法是什么?
例如,给定上面的表,我的select将返回5行。一个用于user_id
3,一个用于4,一个用于8,一个用于23,另一个用于E 110
90E 211
。
我在这个应用程序中使用PHP,所以我想到的一件事就是查询所有活动的位列表,然后在PHP中循环它们,然后以这种方式随机抽取每个user_id一行。这只会导致对MySQL服务器的一次选择调用。
或者,我认为这可以在一系列的子选择中完成,但我不知道如何设置语法。我不确定这会不会慢一点.
发布于 2012-09-17 10:54:17
使用mysql很幸运,因为mysql允许有一个特殊的“技巧”:
select user_id, activity
from activities
group by user_id;
在mysql (仅afaik)中,不需要按列聚合非组列,这样做时,mysql将返回(它为每个组找到的第一行)。
在所有其他数据库中,我知道这个查询会导致语法错误。
现在,尽管这个查询理论上为您提供了随机行-- SQL标准说,如果没有排序,行可能是任意的--但实际上,该查询将为每个用户返回相同的“随机”行,除非您通过执行一些插入/删除操作来更改磁盘上的行顺序。
如果您确实希望“每个用户每次的随机-ie不同,则需要使用此工具从随机排序的行集中进行选择,如下所示:
select user_id, activity
from (select * from activities order by rand()) x
group by user_id;
发布于 2012-09-17 11:10:22
您不能尝试以下查询:
select * from (
select activity, user_id from activities order by rand()
) as x group by user_id;
第一个查询将对记录进行随机排序,第二个查询将返回每个user_id的顶部行。
https://stackoverflow.com/questions/12465321
复制