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