我有一张看起来像这样的 table ...
*------------------------------------*
| 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 子句虽然在这里不是必需的,但将用于我的实际应用程序。)
最佳答案
我觉得不错。如果您担心使用 SUM,您可以轻松地将其转换为 COUNT:
COUNT(CASE WHEN status = 'OK' THEN 1 ELSE NULL END) AS totalgood
顺便说一句:100k 行不再被认为是大的。
关于MYSQL:两个计数,一组......更好的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22500206/