[英]MySQL select 3 UNIQUE random ID rows fast WHERE
我需要能夠從隨着時間的推移逐漸增長和增長的表中選擇3個唯一的隨機MySQL ID行,並具有WHERE'status'='available'。 因此,僅在status = available時才選擇ID號。
不會有間隙,因為將保留所有數據以確保符合記錄要求,如果用戶刪除了數據,則實際上並沒有刪除它,只是將STATUS標記為“已刪除”。
我已經讀過很多關於該主題的文章,但似乎都歸結為僅選擇1個結果,然后重復3次,問題是,它可能會再次選擇相同的ID,因此,對我的問題的任何解決方案將不勝感激。
謝謝
:)
我正在考慮做這樣的事情(從這里取... MySQL從60萬行中快速選擇10個隨機行 )
SELECT id
FROM table AS r1 JOIN
(SELECT (RAND() *
(SELECT MAX(id)
FROM table)) AS id2)
AS r2
WHERE r1.id >= r2.id2 AND status = 'available'
ORDER BY r1.id ASC
LIMIT 1
這滿足了我的需求,但是它只返回1個隨機的唯一“選擇”,如果我將其限制為3,則它並不總是選擇3,如果選擇了3,它們似乎總是順序的,這不是隨機的!
有沒有一種方法可以重復查詢,存儲選擇的ID並繼續循環/運行查詢,直到在AT RANDOM中選擇了3個不同的ID。 這是我的問題:)
你試過了嗎:
SELECT *
FROM mytable
WHERE status = 'available'
ORDER BY RAND( )
LIMIT 0,3;
SELECT DISTINCT *
FROM table
WHERE status = 'available'
ORDER BY RAND()
LIMIT 3
DISTINCT子句應防止重復值。 ORDER BY RAND()將隨機組織結果。
請參閱以下內容; 在談論“差距”的地方,您有一個等效的(狀態=已刪除) http://mysql.rjweb.org/doc.php/random#case_auto_increment_with_gaps_1_or_more_rows_returned (並在該鏈接中查找變體)
這將獲得50個“連續的” id(可能帶有空格),然后隨機提供10個。
-- First select is one-time:
SELECT @min := MIN(id),
@max := MAX(id)
FROM RandTest;
SELECT a.*
FROM RandTest a
JOIN ( SELECT id FROM
( SELECT id
FROM ( SELECT @min + (@max - @min + 1 - 50) *
RAND() AS start FROM DUAL ) AS init
JOIN RandTest y
WHERE y.id > init.start
ORDER BY y.id
LIMIT 50 -- Inflated to deal with gaps
) z ORDER BY RAND()
LIMIT 10 -- number of rows desired
) r ON a.id = r.id;
是的,它很復雜,但是很快,這取決於表的大小。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.