我有下表
我试图做的是选择三个随机图像,但为了确保没有两个图像具有相同的对象,我试图做的是做一个GROUP BY和一个ORDER BY rand()但是是失败的,因为它总是给我cat1.jpg,dog1.jpg,box1.jpg(所有图片的路径以1结尾而不是其他图片)
小提琴包括我跑的查询以及它是如何工作的。
答案 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