mysql - 双重计数语句MySQL查询

标签 mysql sql join

我有下表,其中包含 bool 列 has_object,它指示每一行是否具有关联的数字对象。

+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| pid        | varchar(255) | NO   | PRI |         |       |
| title      | text         | YES  |     | NULL    |       |
| owner_uid  | int(11)      | YES  |     | NULL    |       |
| has_object | int(11)      | YES  |     | NULL    |       |
+------------+--------------+------+-----+---------+-------+

我试过这个查询来获取关于每个 owner_uid 的统计信息。但在我的表中它返回了错误的结果:

SELECT 
  a.owner_uid, 
  count(b.pid) as count1, 
  count(c.pid) as count2  
FROM
  islandora_report a
  JOIN islandora_report b ON b.owner_uid = a.owner_uid AND b.has_object = 0
  JOIN islandora_report c ON c.owner_uid = a.owner_uid AND c.has_object = 1
GROUP BY a.owner_uid;

结果:

enter image description here

最佳答案

因为 BOOLEAN 只是一个 01,你实际上可以做一对 SUM() 没有任何连接来添加列。

SELECT
  owner_uid,
  /* SUM() adds up all the 1 values */
  SUM(has_object) AS count_true,
  /* Invert the boolean with a case statement to get the inverse */
  SUM(CASE WHEN has_object = 1 THEN 0 ELSE 1 END) AS count_false
FROM islandora_report
GROUP BY owner_uid

除上述方法外,还有其他方法可以反转 bool 值。这只是第一个想到的。您还可以从总计数中减去真实的总和,例如:

SUM(has_object) AS count_true,
COUNT(*) - SUM(has_object) AS count_false

关于mysql - 双重计数语句MySQL查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12864503/

相关文章:

java - 如何管理与数据库 SQL 的连接

PHP - 调用未定义的方法

基于另一个字段添加或减去值的 SQL 查询

mysql - 选择所有 child 都满足条件的 self 关系中的行

mysql - 连接 mysql 表时获得最大值的最佳方法

MySQL根据条件排序

mysql - 上传/导入大型sql数据库(仅区别)mysql/linux

mysql - Group by语句列名解析

mysql - 将统计信息存储在数据库中还是在运行时计算它们?

mysql - 如何将其他表的数据添加到双单表MySQL查询中?