如何使用group by子句选择随机行?

时间:2015-02-14 10:38:09

标签: mysql sql random group-by

我有下表

SQLFiddle

我试图做的是选择三个随机图像,但为了确保没有两个图像具有相同的对象,我试图做的是做一个GROUP BY和一个ORDER BY rand()但是是失败的,因为它总是给我cat1.jpg,dog1.jpg,box1.jpg(所有图片的路径以1结尾而不是其他图片)

小提琴包括我跑的查询以及它是如何工作的。

3 个答案:

答案 0 :(得分:9)

您需要的是随机聚合函数。通常在当前的RDBMS中没有这样的函数。

类似的问题有been asked

所以基本的想法是将元素混合,然后分组,然后为每个组只选择每个组的第一行。如果我们修改链接上提供的答案之一,我们就会得到这个。

select object_id, name, image_path
from
  (SELECT images.image_path AS image_path, objects.id AS object_id, objects.name
  FROM objects LEFT JOIN images ON images.object_id = objects.id
  ORDER BY RAND()) as z
group by z.object_id, z.name

答案 1 :(得分:2)

您无法获得随机图像,因为MySQL总是根据插入时间(先到先得)返回该数据,即内部订单。

但您可以使用以下方法(fiddle)获得随机结果:

SELECT images.image_path AS image_path, objects.name 
FROM objects 
LEFT JOIN 
 ( 
   SELECT object_id, 
      SUBSTRING_INDEX(GROUP_CONCAT(image_path order by rand()), ',', 1) AS image_path
   FROM images
   GROUP BY object_id
 ) as images
ON images.object_id = objects.id 
GROUP BY objects.name 

如果对象表上存在限制性WHERE条件,则在首次加入GROUP_CONCAT时可能会获得更好的性能。

答案 2 :(得分:-2)

我认为应该这样做:

ORDER BY random()     限制1