我有一个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你可以玩。
答案 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答案 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