【发布时间】:2015-04-15 09:19:21
【问题描述】:
我有下表
我正在尝试做的是选择三个随机图像,但要确保没有两个图像具有相同的对象,我尝试做的是执行 GROUP BY 和 ORDER BY rand() 但是失败了,因为它总是给我 cat1.jpg、dog1.jpg、box1.jpg(路径以 1 结尾的所有图像,而不是其他图像)
小提琴包括我运行的查询以及它是如何不工作的。
【问题讨论】:
我有下表
我正在尝试做的是选择三个随机图像,但要确保没有两个图像具有相同的对象,我尝试做的是执行 GROUP BY 和 ORDER BY rand() 但是失败了,因为它总是给我 cat1.jpg、dog1.jpg、box1.jpg(路径以 1 结尾的所有图像,而不是其他图像)
小提琴包括我运行的查询以及它是如何不工作的。
【问题讨论】:
您需要的是一个随机聚合函数。目前的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
【讨论】:
您无法获得随机图像,因为 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 时可能会获得更好的性能。
【讨论】:
我认为应该这样做:
随机排序() 限制 1 个
【讨论】: