SQL分组统计条数时,不存在组类型,如何显示条数为0
首先有张表
CREATE TABLE `person` (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`type` int DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
表里很简单三条数据:
INSERT INTO `apollo`.`person`(`id`, `name`, `type`) VALUES (1, 'zhangsan', 1);
INSERT INTO `apollo`.`person`(`id`, `name`, `type`) VALUES (2, 'lisi', 1);
INSERT INTO `apollo`.`person`(`id`, `name`, `type`) VALUES (3, 'jarvis', 2);
type 为1 的是: zhangsan,lisi 。type 为2 的是: jarvis
场景1:
统计type 类型为 1,为2的条数:
SELECTtype,count( * )
FROM`person`
WHEREtype IN ( 1, 2 )
GROUP BYtype
运行结果:
是我们想要的。
如果场景变更,我还要统计 type为3 的条数:
显然type为3的条数我们肉眼看出来了,没有,那如果我们想在查询条件里展示处理,没有的话就 为0
此时,以前的 SQL 就做不到了,因为 Where 条件里面的命中数据没有 type 为3的,无法做数据分组以及统计了,所以我们需要更改一下我们的 SQL 思路
临时表的思路:
SQL 构建一张 type 为 1、2、3的 临时表
SELECT 1 AS `condition` UNION SELECT 2 UNION SELECT 3
(可以是临时表,也可以实际去建一张表,都可以,但开发场景中为了 构建返回数据的一个场景而去建一张表,有没有必要就根据实际的开发场景自己去衡量了)
最终的 SQL
SELECTt.`condition`,IFNULL( p.count, 0 ) AS totalCount
FROM( SELECT 1 AS `condition` UNION SELECT 2 UNION SELECT 3 ) tLEFT JOIN (
SELECT`type` AS t,count( * ) AS count
FROMperson
WHERE`type` IN ( 1, 2, 3 )
GROUP BY`type` ) AS p ON t.`condition` = p.t
这就是我们想要的了…!!