我有一张类似于此的表:http://sqlfiddle.com/#!2/8c877
举个例子,我们可以说它是由“用户”完成的“活动”表。
从表中每个user_id中选择一个随机行的最有效方法是什么?
例如,给定上表,我的select将返回5行。一个用于user_id
3 ,一个用于 4 ,一个用于 8 ,一个用于 23 和一个 90 。
我正在为这个应用程序使用PHP,所以我想的只是查询所有活动的一些列表,然后在PHP中循环遍历它们并按每个user_id随机拉出一行。这将导致只有一个SELECT调用MySQL服务器。
或者我认为这可以在一系列子选择中完成,但我不确定如何设置语法。而且我不确定这反过来会不会那么慢......
答案 0 :(得分:0)
你很幸运使用mysql,因为有一个特殊的“技巧”mysql允许:
select user_id, activity
from activities
group by user_id;
在mysql(仅限afaik)中,您不必聚合非分组列,当您执行此操作时,mysql将返回(为每个组找到的第一行*。
在所有其他数据库中,我知道此查询会导致语法错误。
现在,虽然这个查询在理论上给你随机行 - 但是SQL标准说当没有排序时,行可以按任何顺序排列 - 实际上这个查询将为每个用户返回相同的“随机”行,除非你改变行顺序通过执行一些插入/删除来实现磁盘。
如果您真的想要“随机 - 每次都不同 - 每个用户的行,您需要使用此uqery从随机排序的行集中进行选择,如下所示:
select user_id, activity
from (select * from activities order by rand()) x
group by user_id;
答案 1 :(得分:0)
您无法尝试此查询:
select * from (
select activity, user_id from activities order by rand()
) as x group by user_id;
第一个查询将随机排序记录,第二个查询将返回每个user_id的顶行。