MySQL如何選擇隨機記錄?

在本教程中,您將學習從MySQL的數據庫表中選擇隨機記錄的各類技術方法。html

有時咱們須要從表中選擇隨機記錄,例如:mysql

  • 在博客中選擇一些隨機帖子,並在側欄中顯示。
  • 在「每日報價」窗口小部件中顯示隨機報價。
  • 在圖庫中選擇隨機圖片,並做爲特點圖片。

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

MySQL沒有內置語句來從數據庫表中選擇隨機記錄。爲了實現這個目的,可以使用RAND函數。 如下查詢是從數據庫表中選擇一個隨機記錄:sql

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

讓咱們詳細地看看上面的查詢語句。數據庫

  • RAND()函數爲表中的每一行生成一個隨機值。
  • ORDER BY子句按照RAND()函數生成的隨機數對錶中的全部行進行排序。
  • LIMIT子句選擇隨機排序的結果集中的第一行。

若是要從數據庫表中選擇N個隨機記錄,則須要修改LIMIT子句後指定的值,以下所示:dom

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

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

SELECT 
    t.customer_id, t.customer_name
FROM
    studymysql.customer AS t
ORDER BY RAND()
LIMIT 5;

執行上面的查詢語句,獲得如下結果(每次執行結果都不太同樣) -學習

您可能會獲得一個不一樣的結果數據,由於它是隨機的。code

這種技術很是適合小表。若是在大的表上執行速度是很是緩慢的,由於MySQL必須排序整個表,以挑選隨機的行數據。查詢的速度還取決於表中的行數。表具備的行越多,MySQL都要爲每行生成隨機數,因此所需的時間就越多。htm

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;

使用此技術方法,須要屢次執行查詢以獲取多個隨機行,由於若是增長返回行數限制,查詢將只提供從隨機選擇的行開始的順序行。 如下查詢是從customer表中返回一個隨機客戶。

SELECT 
    t.customer_id, t.customer_name
FROM
    studymysql.customer AS t
	JOIN
	(SELECT ROUND(RAND() * (SELECT  MAX(customer_id) FROM  studymysql.customer)) AS customer_id ) AS x
WHERE
    t.customer_id >= x.customer_id
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;

請注意,用戶定義的變量是特定於鏈接的。因此這種技術方法不能用於鏈接池。此外,主鍵必須是整數類型,其值必須在值是連續沒有間隙的序列中。

在本教程中,咱們展現了幾種從表中選擇隨機記錄的技術方法。

StudyMySQL官方QQ羣(2): 41840707 歡迎各位MySQL學習和用戶加入。

相關文章
相關標籤/搜索