MySQL 中的隨機選擇和排序
查詢 MySQL 資料庫時,通常希望隨機選擇記錄的子集。 ORDER BY RAND() 子句可用來實現此目的。但是,將此子句與其他排序子句組合時,考慮操作的順序非常重要。
嘗試選擇記錄的隨機子集,然後按另一列對結果集進行排序時,會出現一個常見的陷阱。以下查詢是一個範例:
SELECT * FROM users WHERE 1 ORDER BY RAND(), name ASC LIMIT 20
此查詢的目的是從 users 表中隨機選擇 20 個用戶,然後按名稱列升序對他們進行排序。但是,此查詢不會產生所需的結果。
原因是 ORDER BY RAND() 子句引入了非確定性排序。這意味著每次執行查詢時結果的順序都會改變。因此,後續的 name ASC 子句無法用於可靠地對結果進行排序。
為了正確地對結果進行排序,我們需要使用子查詢。以下查詢將隨機選擇 20 個用戶,然後按名稱列對他們進行排序:
SELECT * FROM ( SELECT * FROM users ORDER BY RAND() LIMIT 20 ) T1 ORDER BY name
內部查詢隨機選擇 20 個用戶並將結果儲存在臨時表 T1 中。然後,外部查詢從 T1 中選擇所有行並按名稱對它們進行排序。
以上是如何在MySQL中選擇一個隨機子集然後按另一列排序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!