我的數據庫表有15條記錄,我想在屏幕上隨機顯示9。MySQL RAND()7 LIMIT
SELECT * FROM tablename ORDER BY RAND() LIMIT 9
這是按預期工作,但如果表只有9個記錄呢?我需要抽出15個隨機記錄。
我知道這會重複一個或多個記錄,但這是我的意圖。
我的數據庫表有15條記錄,我想在屏幕上隨機顯示9。MySQL RAND()7 LIMIT
SELECT * FROM tablename ORDER BY RAND() LIMIT 9
這是按預期工作,但如果表只有9個記錄呢?我需要抽出15個隨機記錄。
我知道這會重複一個或多個記錄,但這是我的意圖。
您的select
只會拉取表中的記錄數,而不管order by
。但是,您可以在訂購之前使用各種方法複製表格數據。例如,排在一起的兩倍union all
:
select * from
(
select * from tablename
union all
select * from tablename
) as tmp
order by rand() limit 9
RAND()本身當你處理一個大型數據庫的效率不高。
做這樣的查詢的更好的方法是:
-1。查詢最大的id(假設id是唯一密鑰)
-2。使用php的php函數javascript生成15個隨機數,從1到max_id,推送到陣列
-3。將數組爆炸(例如$ id_list =「'」.implode(「','」,$ id_list)。「'」)
-4。選擇* from tablename其中id爲($ id_list)
我明白需要優化,但這是一個非常小的應用程序,從來沒有任何時候都有超過50條記錄:) – user1861039
即使您在表格中只有一行,這也可以工作。如果您有少於15(比如11)行,你必須在結果的所有11加上4個隨機的:
SELECT col1, col2, ..., colN -- the columns of `tablename` only
FROM
(SELECT a.i, b.j, t.*
FROM
(SELECT *, RAND() AS rnd
FROM tablename
ORDER BY rnd LIMIT 15
) AS t
CROSS JOIN
(SELECT 1 AS i UNION ALL SELECT 2 UNION ALL
SELECT 3 UNION ALL SELECT 4)
AS a
CROSS JOIN
(SELECT 1 AS j UNION ALL SELECT 2 UNION ALL
SELECT 3 UNION ALL SELECT 4)
AS b
ORDER BY i, j, rnd
LIMIT 15
) AS t15
ORDER BY RAND() ;
如果你想「更多的」隨機性,在結果中有重複或三次行有可能是一些行完全不顯示,更換最後五行搭配:
AS b
ORDER BY RAND()
LIMIT 15
) AS t15 ;
感謝您的答覆,unfortunaltly這將導致以下錯誤 「每個派生的表必須有它自己的別名」,所以我suspose我需要查詢別名命名:) – user1861039
當表格有4行或更少的行時,這當然會顯示少於9個結果。 –
而當表格有9行或更多行時,(9)結果中可能仍有重複項,而其他行根本不會返回。 (這可能是由OP所要求的,但應該提及的是 –