MySQL隨機選擇記錄

2019-10-16 22:56:59

在本教學中,您將學習從MySQL中的資料庫表中查詢選擇隨機記錄的各種技術。

有時,必須從表中選擇隨機記錄,例如:

  • 在部落格中選擇一些隨機的貼文,並在側邊欄中顯示。
  • 選擇一個隨機報價來顯示「當天的報價」小部件。
  • 在畫廊中選擇隨機圖片,並將其用作精選照片。

MySQL使用ORDER BY RAND()選擇隨機記錄

MySQL沒有任何內建語句從資料庫表中選擇隨機記錄。為了實現這一點,您可以使用RAND函式。以下查詢從資料庫表中選擇一個隨機記錄:

SELECT 
    *
FROM
    tbl
ORDER BY RAND()
LIMIT 1;

讓我們更詳細地檢視上面的查詢語句 -

  • RAND()函式為表中的每一行生成一個隨機值。
  • ORDER BY子句通過RAND()函式生成的亂數對表中的所有行進行排序。
  • LIMIT子句選擇隨機排序的結果集中的第一行。

如果要從資料庫表中選擇N個隨機記錄,則需要如下更改LIMIT子句:

SELECT 
    *
FROM
    table
ORDER BY RAND()
LIMIT N;

例如,要在customers表中查詢選擇5個隨機客戶,請使用以下查詢:

SELECT 
    t.customerNumber, t.customerName
FROM
    customers AS t
ORDER BY RAND()
LIMIT 5;

因為是隨機,您可能會得到一個不同的結果集。

這種技術與一個小表上非常好。但是對於大表將是非常緩慢的,因為MySQL必須對整個表進行排序以選擇亂數。查詢的速度也取決於表中的行數。 表的行數越多,生成的亂數所花的時間就越多。

MySQL使用INNER JOIN子句選擇隨機記錄

該技術要求您要選擇隨機記錄的表具有自動增量主鍵欄位,並且序列中沒有間隙。

以下查詢根據主鍵列生成亂數:

SELECT 
        ROUND(RAND() * ( SELECT 
                    MAX(id)
                FROM
                    table)) as id;

我們可以通過上述查詢返回的結果集連線表,如下所示:

SELECT 
    t.*
FROM
    table AS t
        JOIN
    (SELECT 
        ROUND(RAND() * (SELECT 
                    MAX(id)
                FROM
                    table )) AS id
    ) AS x
WHERE
    t.id >= x.id
LIMIT 1;

使用這種技術,您可多次執行查詢以獲取多個隨機行,因為如果增加限制,則查詢將僅給出從隨機選擇的行開始的順序行。

以下查詢從customers表返回一個隨機客戶。

SELECT 
    t.customerNumber, t.customerName
FROM
    customers AS t
        JOIN
    (SELECT 
        ROUND(RAND() * (SELECT 
                    MAX(customerNumber)
                FROM
                    customers)) AS customerNumber
    ) AS x
WHERE
    t.customerNumber >= x.customerNumber
LIMIT 1;

MySQL使用變數選擇隨機記錄

如果表的id列的值範圍為1 .. N,並且範圍內沒有間隙,則可以使用以下技術:

  • 首先,選擇1..N範圍內的亂數字。
  • 第二步,根據亂數選擇記錄。

以下語句可以完成此操作:

SELECT 
    table. *
FROM
    (SELECT 
        ROUND(RAND() * (SELECT 
                    MAX(id)
                FROM
                    table)) random_num,
            @num:=@num + 1
    FROM
        (SELECT @num:=0) AS a, table
    LIMIT N) AS b,
    table AS t
WHERE
    b.random_num = t.id;

請注意,使用者定義的變數是連線特定的。這意味著這種技術不能與連線池一起使用。此外,主鍵必須是整數型別,其值必須在沒有間隙的序列中。

在本教學中,我們向您展示了從表中選擇隨機記錄的幾種技術。