簡體   English   中英

MySQL快速選擇3個唯一隨機ID行

[英]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 (並在該鏈接中查找變體)

  • 要求:AUTO_INCREMENT,可能由於DELETE等而存在間隙
  • 瑕疵:僅半隨機(行被拾取的機會均等),但確實可以部分彌補差距
  • 缺陷:表的前幾行和后幾​​行不太可能被交付。

這將獲得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.

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