带有单个查询的MYSQL多个COUNT()[重复]
Posted
技术标签:
【中文标题】带有单个查询的MYSQL多个COUNT()[重复]【英文标题】:MYSQL Multiple COUNT() With Single Query [duplicate] 【发布时间】:2016-04-22 20:41:36 【问题描述】:我想通过单个查询获得总 ROW 类型。让我解释一下。
通常我使用这个查询来获取其中一个:
$database->query("SELECT COUNT(*) as c FROM workers WHERE job = 1");
$totalWorkers = $database->fetchObject()->c;
因此,它完美无缺,但还有 7 种工作类型 (0-8)。这只是 (1)。
我可以这样做:[执行的查询过多,不好]
$database->query("SELECT COUNT(*) as c FROM workers WHERE job = 1");
$totalWorkers1 = $database->fetchObject()->c;
$database->query("SELECT COUNT(*) as c FROM workers WHERE job = 2");
$totalWorkers2 = $database->fetchObject()->c;
但我不想执行这些多个查询,有什么简单的方法可以做到吗?我想得到这样的计数结果:
$totalWorkers2 = $database->fetchObject()->type_1;
$totalWorkers2 = $database->fetchObject()->type_2;
我到处搜索,但找不到任何逻辑……
【问题讨论】:
我知道,有很简单的方法可以做到这一点,但我想不出来。SELECT job, COUNT(*) as c FROM workers group by job
?
我怎样才能得到它的结果? $database->fetchObject()-> ...
为什么只用一个查询呢?先让它工作,然后再优化关键部分。
我总是优化我的查询,因为有大约 150 万条记录......
【参考方案1】:
SELECT sum(IF(job=1,1,0)) as job1count, sum(IF(job=2,1,0)) as job2count FROM workers;
或者
SELECT job, count(*) as c FROM workers where job in (1,2) GROUP BY job;
取决于您是否希望它们在同一条记录中
【讨论】:
第一个示例的好主意,以与 OP 请求的结果保持一致 哇!非常感谢先生。这真的是很好的答案!而且快! 第一个查询可以简化:SELECT SUM(job = 1), SUM(job = 2) ...
@shmosel, SUM(job = 1)
如果不存在带有job=1
的行,则可以返回NULL
而不是0
。
@PaulSpiegel,如果job
是除 1 或 NULL
以外的任何值,job = 1
的计算结果为 0(又名 FALSE
)。因此,只有当所有值都是NULL
,或者根本没有结果时(在这种情况下,任何SUM()
变体都将返回NULL
),您的陈述才是正确的。当然,如果这是一个问题,只需执行IFNULL(SUM(...), 0)
。【参考方案2】:
您可以按工作对结果进行分组
$database->query("SELECT job, COUNT(*) as c FROM workers WHERE job in (1,2) group by job");
$tmp = $database->fetchAll();
$result = array();
foreach ($tmp as $o) $result[$o->job] = $o->c;
然后使用数组$result
作为$result[1]
用于job=1,$result[2]
用于job=2
如果您需要所有作业的计数,您可以按作业 WHERE job in (1,2)
删除过滤器
【讨论】:
以上是关于带有单个查询的MYSQL多个COUNT()[重复]的主要内容,如果未能解决你的问题,请参考以下文章