每个不同的字段值选择随机行?

时间:2012-03-08 21:08:11

标签: php mysql

我有一个MySQL查询,结果如下:

person | some_info 
==================
   bob | pphsmbf24
   bob | rz72nixdy
   bob | rbqqarywk
  john | kif9adxxn
  john | 77tp431p4
  john | hx4t0e76j
  john | 4yiomqv4i
  alex | n25pz8z83
  alex | orq9w7c24
  alex | beuz1p133
   etc...

(这只是一个简化的例子。实际上我的结果中有大约5000行。)

我需要做的是浏览列表中的每个人(bob,john,alex等等)并从他们的结果集中取出一行。我抽出的那一行是随机的,但也有点基于一组松散的条件。在这里指定条件并不重要,所以我只是说这是一个随机的例子。

无论如何,使用PHP,这个解决方案非常简单。我进行查询并返回5000行并迭代它们,为每个人拉出我的随机行。容易。

但是,我想知道是否有可能从MySQL查询得到我想要的东西,这样我就不必使用PHP来迭代结果并拉出我的随机行。

我感觉它可能涉及一个子选择的BUNCH,就像每个人一个,在这种情况下,解决方案将比我当前的解决方案更多的时间,资源和带宽密集。

是否有一个聪明的查询可以在一个命令中完成所有这些?

Here is an SQLFiddle你可以玩。

4 个答案:

答案 0 :(得分:6)

要获取不同名称的随机值,请使用

SELECT r.name, 
(SELECT r1.some_info FROM test AS r1 WHERE r.name=r1.name ORDER BY rand() LIMIT 1) AS     'some_info' 
FROM test AS r 
GROUP BY r.name ;  

将此查询放在您的sqlfiddle中,它将起作用

我使用r和r1作为表别名。这也将使用子查询为名称

选择随机some_info

SQL Fiddle is here

答案 1 :(得分:0)

我的第一个回应是使用php生成随机数:

$ randId = rand($ min,$ max);

然后运行一个SQL查询,该查询只获取索引等于$ randID的记录。

答案 2 :(得分:0)

以下是解决方案:

select person, acting from personel where id in (
select lim from 
    (select count(person) c, min(id) i, cast(rand()*(count(person)-1) +min(id)
             as unsigned) lim from personel group by person order by i) t1
)

示例中使用的表格如下:

create table personel (
id int(11) not null auto_increment,
person char(16),
acting char(19),
primary key(id)

);

insert into personel (person,acting) values
('john','abd'),('john','aabd'),('john','adbd'),('john','abfd'),
('alex','ab2d'),('alex','abd3'),('alex','ab4d'),('alex','a6bd'),
('max','ab2d'),('max','abd3'),('max','ab4d'),('max','a6bd'),
('jimmy','ab2d'),('jimmy','abd3'),('jimmy','ab4d'),('jimmy','a6bd');

答案 3 :(得分:-1)

您可以限制查询次数,并按“rand()”排序以获得所需的结果。

也许你尝试过这样的事情:

SELECT name, some_info
  FROM test
 WHERE name = 'tara'
 ORDER BY rand()
 LIMIT 1