如何 select 带有 group by 子句的随机行?

How to select a random row with a group by clause?

我有以下table

SQLFiddle

我试图做的是 select 三张 运行dom 图像,但为了确保没有两张图像具有相同的对象,我试图做的是做一个 GROUP BY 连同 ORDER BY 运行d() 但这失败了,因为它总是给我 cat1.jpg、dog1.jpg、box1.jpg(所有路径以 1 结尾的图像和不是其他人)

fiddle 包括查询 I 运行 以及它如何不工作。

我认为应该这样做:

随机排序() 限制 1

您需要的是随机聚合函数。目前的RDBMS通常没有这样的功能。

类似的问题有been asked

所以基本思想是打乱元素,然后分组,然后对于每个组 select 每个组的第一行。如果我们修改 link 上提供的答案之一,我们会得到这个。

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

您无法获得随机图像,因为 MySQL 始终 returns 该数据基于插入时间(先到先得),即内部顺序。

但您可以使用以下方法获得随机结果 (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 

如果对象 table 有限制性的 WHERE 条件,当您先加入 GROUP_CONCAT 时可能会获得更好的性能。