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
相关推荐
Zzzzmo_4 小时前
【MySQL】JDBC(含settings.xml文件配置/配置国内镜像以及pom.xml文件修改)
数据库·mysql
FirstFrost --sy5 小时前
MySQL内置函数
数据库·mysql
eggwyw6 小时前
MySQL-练习-数据汇总-CASE WHEN
数据库·mysql
mygljx8 小时前
MySQL 数据库连接池爆满问题排查与解决
android·数据库·mysql
Bdygsl9 小时前
MySQL(1)—— 基本概念和操作
数据库·mysql
身如柳絮随风扬9 小时前
什么是左匹配规则?
数据库·sql·mysql
jiankeljx10 小时前
mysql之如何获知版本
数据库·mysql
小李来了!10 小时前
数据库DDL、DML、DQL、DCL详解
数据库·mysql
我科绝伦(Huanhuan Zhou)11 小时前
【生产案例】MySQL InnoDB 数据损坏崩溃修复
数据库·mysql·adb
海棠蚀omo12 小时前
从零敲开 MySQL 的大门:库与表的基础操作实战(保姆级入门指南)
数据库·mysql