2014-03-19 13 views
2

我有一個看起來像這樣的表...MYSQL:兩項計數,一組......更好的方法?

*------------------------------------* 
| id | state | name | status | 
|------|---------|--------|----------| 
| 1 | AZ | Tim | OK  | 
| 2 | AZ | Jon | BAD | 
| 3 | NV | Bob | BAD | 
| 4 | NV | Ted | OK  | 
| 5 | NV | Don | BAD | 
| 6 | CO | Guy | OK  | 
| 7 | CO | Jed | OK  | 
| 8 | CA | Cal | BAD | 
| 9 | CA | Tom | OK  | 
| 10 | CA | Ian | OK  | 
*------------------------------------* 

我需要產生一個結果,看起來像這樣...

*--------------------------------* 
| state | total | totalgood | 
|---------|--------|-------------| 
| AZ | 2  | 1   | 
| NV | 3  | 1   | 
| CO | 2  | 2   | 
| CA | 3  | 2   | 
*--------------------------------* 

我能做到這樣的...

SELECT state AS state, 
    COUNT(*) AS total, 
    SUM(CASE WHEN status = 'OK' THEN 1 ELSE 0 END) AS totalgood 
FROM mytable 
WHERE state IN ('AZ','NV','CO','CA') 
GROUP BY state; 

我的問題是,這是一個非常大的表超過100K記錄。我的理解是,使用SUM會導致它循環遍歷每一行。這可能是一個非常大的表現。

那麼有沒有更好的方法來做到這一點?或者......我的擔心是沒有根據的?我認識到,我對MySQL並不熟悉,而且我很難在JOIN中找到自己的想法。所以,任何建議表示讚賞。

(*注意WHERE子句,而在這裏沒有必要的,將是我真正的應用程序。)

回答

2

這對我來說很好。如果您擔心使用SUM您可以輕鬆地將其轉換爲計數:

COUNT(CASE WHEN status = 'OK' THEN 1 ELSE NULL END) AS totalgood 

BTW:100K行不被視爲大了。

+0

我知道100K是不是一噸,但我這運行在硬件上等於小於大多數手機,與其他進程運行。所以我可以做的任何事情來擠出更多的表現是好的;-) 因此CASE語句上的COUNT與SUM沒有相同的性能命中?在這種情況下,它幾乎看起來是一樣的。 –

+0

@ AZ-T我不知道,我還沒有用過很多的mysql,我主要工作在Oracle數據庫上。如果你有一個合適的索引(包含狀態和狀態),它應該仍然相當快。 –

0

嘗試使用與組彙總-功能通過

DOC

+0

我不認爲這真的是我要找的。 –

相關問題