2013-06-02 67 views
2

我必須從列中隨機選擇4行。多選'列其中...'vs選擇所有列

是最好隨機產生4名和執行4個請求「從數據庫中選擇列其中id = ...」

還是要選擇一個請求所有行後選擇?

+0

你想從數據庫中隨機選擇4行?最好在一個請求中全部選中它們。 – Anujan

+0

你究竟想達到什麼目的?你有任何代碼要顯示嗎?你現在使用哪種方法,爲什麼? – bestprogrammerintheworld

回答

0

如果你能夠生成隨機存在的id,我認爲最好的方法是使用一個像where id in (id1, id2, id3, id4)這樣的子句。這將導致在一個查詢中獲得4條記錄,因此不會獲取不必要的查詢或記錄。

+0

取決於ID的命名規則,OP可能需要從整個表中預先獲取ID列表,隨機選擇4,然後重新查詢數據庫;)像這樣 - http:// stackoverflow。 com/questions/4329396/mysql-select-10-random-rows-from-600k-rows-fast – Terry

+0

確實如此,但這可能比獲取所有記錄更有效,然後隨機選擇4,除非多個查詢的成本非常高(即高延遲)。 –

+0

啊,我想我錯誤地使用了重新查詢這個詞 - 我的意思是,您將當前數據庫加入自身,但是通過加入從同一數據庫中隨機選擇的ID列表來完成(請參閱我在我之前的評論) – Terry

0

如前所述,where id in (id1, id2, id3, id4)是從MySQL角度來看最快的方式。實際上,在生成這些ID的應用程序中需要一些邏輯:所有4個ID必須存在,隨機分佈,並且您希望避免重複。在最壞的情況下,您將通過巨大查詢檢索所有existend ID的列表,提取4個隨機值並重新查詢。

用做所有的邏輯,它可以是明智的選擇移動到MySQL:

SELECT * FROM foobar 
ORDER BY RAND() 
LIMIT 4; 

你必須明白,這是在MySQL慢,但你必須在應用程序的速度增益邏輯,並且可以肯定地獲得隨機值在你的桌子上平均種子。

編輯: 該評論詢問PHP是否在此任務緊固然後MySQL。答案是否定的。 這不是通過「使用蘭特」來完成的。你需要一個包含PHP中所有這些ID的數組。這是一個巨大的查詢,大量的TCP流量,巨大的數組將被建立在PHP中,巨大的樹將被zend引擎建立。然後,使用這些ID,您必須啓動第二個查詢以獲取這些ID的行。

+0

選擇所有的行,並在PHP中使用rand比rand更快嗎? – user2409399

+0

@ user2409399我更新了我的答案並用「php」重新簽名了您的問題 –

+0

在php中用rand()進行了巨大查詢?用4個ID的? – bestprogrammerintheworld

0

儘管RAND()函數可能會很慢,但到目前爲止我還沒有遇到速度問題。我的策略實際上是將數據庫加入到查詢本身,並返回一個帶有限制的隨機ID列表。

SELECT * 
FROM table AS t1 
JOIN (
    SELECT rowID 
    FROM table 
    ORDER BY RAND() 
    LIMIT 4 
) AS t2 
WHERE t1.rowID = t2.rowID 

還有存在一個更強大的解決方案 - 嘗試檢查出this question(2010年提出)。