如何 select 带有 group by 子句的随机行?
How to select a random row with a group by clause?
我有以下table
我试图做的是 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 时可能会获得更好的性能。
我有以下table
我试图做的是 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 时可能会获得更好的性能。