在本教學中,您將學習從MySQL中的資料庫表中查詢選擇隨機記錄的各種技術。
有時,必須從表中選擇隨機記錄,例如:
MySQL沒有任何內建語句從資料庫表中選擇隨機記錄。為了實現這一點,您可以使用RAND
函式。以下查詢從資料庫表中選擇一個隨機記錄:
SELECT
*
FROM
tbl
ORDER BY RAND()
LIMIT 1;
讓我們更詳細地檢視上面的查詢語句 -
如果要從資料庫表中選擇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必須對整個表進行排序以選擇亂數。查詢的速度也取決於表中的行數。 表的行數越多,生成的亂數所花的時間就越多。
該技術要求您要選擇隨機記錄的表具有自動增量主鍵欄位,並且序列中沒有間隙。
以下查詢根據主鍵列生成亂數:
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;
如果表的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;
請注意,使用者定義的變數是連線特定的。這意味著這種技術不能與連線池一起使用。此外,主鍵必須是整數型別,其值必須在沒有間隙的序列中。
在本教學中,我們向您展示了從表中選擇隨機記錄的幾種技術。