簡體   English   中英

如何使用group by子句選擇隨機行?

[英]How to select a random row with a group by clause?

我有下表

SQLFiddle

我試圖做的是選擇三個隨機圖像,但為了確保沒有兩個圖像具有相同的對象,我試圖做的是做一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM