[英]How to select a random row with a group by clause?
我有下表
我試圖做的是選擇三個隨機圖像,但為了確保沒有兩個圖像具有相同的對象,我試圖做的是做一個GROUP BY和一個ORDER BY rand()但是失敗了它總是給我cat1.jpg,dog1.jpg,box1.jpg(所有圖片的路徑以1結尾而不是其他圖片)
小提琴包括我跑的查詢以及它是如何工作的。
你需要的是一個隨機聚合函數。 通常在當前的RDBMS中沒有這樣的功能。
有人問過類似的問題。
所以基本的想法是將元素混合,然后分組,然后為每個組選擇每個組的第一行。 如果我們修改鏈接上提供的答案之一,我們就會得到這個答案。
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總是根據插入時間(先到先得)返回該數據,即內部訂單。
但是您可以使用以下方法( 小提琴 )獲得隨機結果:
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時可能會獲得更好的性能。
我認為這應該做到:
ORDER BY random()LIMIT 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.