3

我有一个类似这样的表:http ://sqlfiddle.com/#!2/8c877

例如,假设它是由“用户”完成的“活动”表。

从表中为每个 user_id 选择一个随机行的最有效方法是什么?

例如,给定上表,我的选择将返回 5 行。user_id 3个1个,4个1个,8个1个,23个1个,90个1个。

我在这个应用程序中使用 PHP,所以我在想的一件事就是查询所有活动的位列表,然后在 PHP 中循环遍历它们,并以这种方式随机拉出每个 user_id 的一行。这将导致只对 MySQL 服务器进行一次 SELECT 调用。

或者,我认为这可以在一系列子选择中完成,但我不确定如何设置语法。而且我不确定这是否会更慢......

4

2 回答 2

0

你不能试试这个查询:

select * from (
select activity, user_id from activities order by rand()
) as x group by user_id;

第一个查询将随机排序记录,第二个查询将只返回每个 user_id 的顶行。

于 2012-09-17T19:10:22.820 回答
0

使用 mysql 很幸运,因为 mysql 允许使用一个特殊的“技巧”:

select user_id, activity
from activities
group by user_id;

请参阅sqlfiddle 中的此查询

在 mysql (only, afaik) 中,你不必聚合非 group-by 列,当你这样做时,mysql 返回它为每个组找到的 (first* 行。

在所有其他数据库中,我知道这个查询会导致语法错误。


现在,虽然这个查询理论上给你随机行 - SQL 标准说,当没有排序时,行可能是任何顺序 - 实际上这个查询将为每个用户返回相同的“随机”行,除非你更改行顺序通过执行一些插入/删除来磁盘。

如果您真的想要“随机 - 即每次都不同 - 每个用户的行,您需要使用此 uqery 从随机排序的行集中进行选择,如下所示:

select user_id, activity
from (select * from activities order by rand()) x
group by user_id;

在 sqlfiddle 中查看此查询

于 2012-09-17T18:54:17.493 回答