MYSQL:两个计数,一组......更好的方法?

标签 mysql sql performance

我有一张看起来像这样的 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/

相关文章:

php - 使用新值更新联结表

php - 如何根据表头将多条记录显示为表头和final

php - 以相反的方式显示数据库中的消息

javascript - 如何使用不同表中的列数据从其他表中获取数据?

php - Mysql在2个表左连接中搜索

javascript - 如何使用反引号在 node.js 中编写多行 MySQL 查询?

Java 数据库立即断开连接

javascript - 从 JavaScript 数组中获取对象值的最大值和最小值

python - 生成包含随机 boolean 值的大型 numpy 数组的内存有效方法

performance - 无法避免在 CPU 上单独启动的进程的上下文切换