Mysql
如何使用 count() 選擇隨機行
表名:
g_number name 123 John 123 Sara 123 Michael
我想在一個查詢中獲得一個隨機名稱和具有相同 g_number 的所有名稱的數量:
SELECT name, count(*) cnt FROM names WHERE g_number='123' ORDER BY rand()
但結果總是一樣的
name cnt John 3
看起來 count() 忽略了 ORDER BY rand() 行。所以這就是問題:是否有可能在一個查詢中解決這個問題?
我認為您想在一個查詢中做兩件不同的事情:
- 從所有的中隨機選擇一個 `name``WHERE g_number=123
- 計算所有行
WHERE g_number=123
。如果這是您想要做的,請使用兩個子查詢:
SELECT ( SELECT name FROM t WHERE g_number = 123 ORDER BY rand() LIMIT 1 ) AS name , ( SELECT count(*) FROM t WHERE g_number = 123 ) AS count_of_123
這會給你一個結果:
| name | count_of_123 | |---------|--------------| | Sara | 3 |
要麼
| name | count_of_123 | |---------|--------------| | Michael | 3 |
要麼
| name | count_of_123 | |---------|--------------| | John | 3 |
您可以在http://sqlfiddle.com/#!9/5342d2/8/0查看
這不僅僅是 MySQL,它是標準 SQL(可能除了
rand()
函式名稱,它可能依賴於 DBMS)。該查詢還清楚地反映了您想要做兩件(相關但不同的)事情的事實。您還可以在 SQLFiddle 查看PostgreSQL 版本和SQLite版本。在 MySQL 的領域內,您可以使用一個也可以工作的非標準查詢(並且從性能方面來說,它可能更好):
SELECT name, count(*) AS count_of_123 FROM ( SELECT name FROM t WHERE g_number = 123 ORDER BY rand() ) AS q0 ;
我認為這更接近原始海報的想法。即便如此,我也不會依賴它。這與標準 SQL相差甚遠。MySQL可能決定在未來改變它的實現方式和行為方式。此外,恕我直言,查詢的意圖是什麼不太清楚。