MySQL 裡用 Count 和 Group By 來做統計是常用的寫法。舉例來說,以下兩個 table,一個紀錄公司行號的資料,一個紀錄員工資料。
id | company |
---|---|
1 | |
2 | Microsoft |
id | employee | company |
---|---|---|
1 | Jack | |
2 | Eric | Microsoft |
用下列查詢:
SELECT c.company, count(e.company) as employees FROM company c LEFT JOIN employee e ON c.id = e.company GROUP BY e.company
可以得到如下結果
company | employees |
---|---|
0 | |
Microsoft | 2 |
不過有時候碰到沒有 table 可以做 JOIN 參照時,碰到 0 就不會顯示。
例如下表,status 欄位表示狀態,假設有 0 ~ 3 四種。
id | company | status |
---|---|---|
1 | 0 | |
2 | Microsoft | 0 |
3 | Nokia | 3 |
這時候用以下查詢
SELECT status, count(status) as num FROM status_table GROUP BY status
得到以下結果
status | num |
---|---|
0 | 2 |
3 | 1 |
四種狀態只剩下有值的 0 和 3。通常碰到這種沒有 table 可以 join 的情況,我會去找一個剛好有對應的值的 table 來做 join,即使是實際上無關的 table 也無所謂,只要把空值補齊就算是達到目的了。
但是也有遇過真的沒有 table 可以 join 時,只好自己想辦法了…. Orz
SELECT fake.status, COUNT(status.status) AS num FROM (SELECT 0 AS status UNION SELECT 1 AS status UNION SELECT 2 AS status UNION SELECT 3 AS status) fake LEFT JOIN status ON status.status = fake.status GROUP BY fake.status
用列舉一個 fake table 的方式來 join,可以得到以下結果
status | num |
---|---|
0 | 2 |
1 | 0 |
2 | 0 |
3 | 1 |
這個方法感覺有點呆,不過解決了困擾,先將就著用。
Leave a Reply