带有单个查询的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()[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在MySQL单个表中找到重复的值

组合 COUNT 查询 [重复]

MySQL查询删除重复记录

将多个 CSV 文件加载到 MYSQL 中的单个表中 [重复]

单个 SQL 查询中的多个计数

在单个 MySQL 查询中使用多个临时表(适用于 phpMyAdmin,但不适用于 PHP)