mysql统计所有分类下的数量,没有的也要展示

要求统计所有分类下的数量,如果分类下没有对应的数据也要展示。这种问题在日常的开发中很常见,每次写每次忘,所以在此记录下。

这种统计往往不能直接group by,因为有些类别可能没有对应的数据

这里有两个思路(如果您有更好的方法,请一定要告诉我,求求了):

  1. 每种类型分别统计,用union 连接(比较适合类型已知、不多且确定的)

    过UNION操作符组合了三个独立的查询,每个查询都基于数据表计算了不同条件下的数量,简单粗暴,但不是很推荐

    sql 复制代码
    SELECT `status` `key`,COUNT(id) amount FROM 数据表 WHERE `status` IS NULL
    UNION 
    SELECT 1 `key`,COUNT(id) amount FROM 数据表  WHERE `status` = 1
    UNION 
    SELECT 2 `key`,COUNT(id) amount FROM 数据表 WHERE `status` = 2
    UNION 
    SELECT 3 `key`,COUNT(id) amount FROM 数据表  WHERE `status` = 3

    优化(枚举类型,left join数据表):

    sql 复制代码
    SELECT
    	a.`key`,
    	IFNULL( b.amount, 0 ) amount 
    FROM
    	( SELECT 1 AS `key` UNION SELECT 2 UNION SELECT 3 ) AS a
    LEFT JOIN ( SELECT `status` `key`, COUNT( id ) amount FROM 数据表 GROUP BY `status` ) AS b ON a.`key` = b.`key`

    性能分析:

    第一个SQL语句进行了多次全表扫描(假设索引未覆盖status字段)。这种做法可能导致更多的磁盘I/O操作,尤其是当数据量较大时,性能开销会较高。

    第二个SQL语句仅对数据表进行了一次扫描,并利用了GROUP BY进行聚合操作,减少了磁盘I/O,理论上在大多数情况下比第一个SQL更高效。

    结论

    第二个SQL语句在性能和耗时上通常优于第一个SQL语句,因为它只需要遍历表一次,并对结果进行一次性聚合,避免了多次全表扫描带来的性能损失。

    若status字段上有索引,第二个SQL的优势会更加明显,因为可以利用索引加速查询过程。

  2. 先查类型表,left join数据表,最后对left join后的数据再进行分组,注意:要给右表(数据表)为空时判断

    和第一个的优化版思路是一样的

    sql 复制代码
    SELECT
    	a.id `key`,
    	a.classify_name `name`,
    	COUNT(b.id) `count`
    FROM
    	分类表 a
    LEFT JOIN 数据表 b ON b.`level` = a.id
    GROUP BY a.id
相关推荐
思成不止于此7 小时前
【MySQL 零基础入门】DQL 核心语法(二):表条件查询与分组查询篇
android·数据库·笔记·学习·mysql
帝吃藕和8 小时前
MySQL 知识点复习- 4. update/delete/like
mysql
杨云龙UP9 小时前
MySQL 自动备份与覆盖恢复实战:一套脚本搞定全库/按库备份恢复
linux·运维·数据库·sql·mysql
梁萌13 小时前
MySQL索引的使用技巧
数据库·mysql·索引·b+tree
_果果然14 小时前
数据库、表、字段:理解MySQL的三层结构
数据库·mysql
TT哇17 小时前
【Database Navigator 插件】idea 社区版连接 mysql 数据库
java·数据库·mysql·intellij-idea·database
ao_lang17 小时前
MySQL的存储过程和触发器
android·数据库·mysql
ZePingPingZe18 小时前
Spring Boot + MySQL读写分离实现方案
spring boot·mysql·adb
honder试试18 小时前
Centos7从0-1安装部署Clickhouse验证与Mysql实时同步
数据库·mysql·clickhouse
Shingmc318 小时前
MySQL表的约束
数据库·mysql