我的數據庫目前有300行,並且在未來幾年內可能會增加到5000行左右。我想知道如何隨機選擇20行。MySQL從300行快速選擇20行隨機行
我發現這裏MySQL select 10 random rows from 600K rows fast(在那裏再次refered到http://jan.kneschke.de/projects/mysql/order-by-rand/)下面的代碼生成一個隨機選擇非常快:
SELECT name
FROM random AS r1 JOIN
(SELECT (RAND() *
(SELECT MAX(id)
FROM random)) AS id)
AS r2
WHERE r1.id >= r2.id
ORDER BY r1.id ASC
LIMIT 1
所以在PHP中我嘗試了以下得到20行:
$anfrage = "SELECT name
FROM random AS r1 JOIN
(SELECT (RAND() *
(SELECT MAX(id)
FROM random)) AS id)
AS r2
WHERE r1.id >= r2.id
ORDER BY r1.id ASC
LIMIT 20";
$ergebnis=$db->query($anfrage)
or die($db->error);
while($zeile=mysqli_fetch_assoc($ergebnis))print_r($zeile);
但是當我運行腳本時,大多數時候我不會得到20行。實際上,從300箇中選出20個不同行的概率約爲48.8%。
我可以更改上面的代碼來獲得真正的行嗎?
的範圍內,你的問題是,r2.id可能是299,所以你將有隻有兩排WHERE 「r1.id> = r2.id」爲真 – nidomiro
@niccomatik我想我必須將Limit設置爲'1'並在循環中執行整個查詢。然後,在每次查詢後,我必須檢查獲得的行是否是新行 - 是如何工作的? – Adam
即使在50000行時,一個簡單的隨機選擇也會很快。 5000行不算什麼。 MySQL可能甚至不會使用索引查詢表的大小更容易掃描表,所以我不知道爲什麼你擔心速度。 – Namphibian