首页 > 数据库 >mysql统计所有分类下的数量,没有的也要展示

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

时间:2024-03-28 10:24:57浏览次数:24  
标签:status 展示 分类 数据表 amount key mysql id SELECT

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

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

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

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

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

    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数据表):

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

    结论

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

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

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

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

    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
    

标签:status,展示,分类,数据表,amount,key,mysql,id,SELECT
From: https://www.cnblogs.com/daydreamer-fs/p/18100943

相关文章

  • MYSQL语句-查询
    1、制表CREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`createDate`datetimeDEFAULTNULLCOMMENT'创建时间',`userName`varchar(20)DEFAULTNULLCOMMENT'姓名',`pwd`varchar(36)DEFAULTNULLCOMM......
  • MySql单表操作学习DDL_DML_DQL语句
     数据库名称可以为【schoolDB】,字符集【utf8】,排序规则【utf8_general_ci】。1、创建数据表——DDLCREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`createDate`datetimeDEFAULTNULLCOMMENT'创建时间',`userName`varchar......
  • MySQL基础操作练习
    练习表CREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`createDate`datetimeDEFAULTNULLCOMMENT'创建时间',`userName`varchar(20)DEFAULTNULLCOMMENT'姓名',`pwd`varchar(36)DEFAULTNULLCOMME......
  • MYSQL各类查询语句—DDL
    1.联系表CREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`createDate`datetimeDEFAULTNULLCOMMENT'创建时间',`userName`varchar(20)DEFAULTNULLCOMMENT'姓名',`pwd`varchar(36)DEFAULTNULLCO......
  • mysql 主从复制 -- django发送钉钉通知
    mysql主从搭建#之前做过redis的主从,很简单#mysql稍微复杂一些,搭建mysql主从的目的是?-读写分离-单个实例并发量低,提高并发量-只在主库写,读数据都去从库#原理MySQL服务器之间的主从同步是基于二进制日志机制(binlog),主服务器使用二进制日志来(bi......
  • 【附源码】django计算机毕业设计web的学生作业管理系统(源码+mysql+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:在当今信息化、数字化的教育环境中,学生作业管理已成为教学过程中不可或缺的一部分。传统的作业管理方式,如纸质作业本、电子邮件提交等,存在着效率低下、资源......
  • 【附源码】django计算机毕业设计病房管理系统设计与实现(源码+mysql+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:在现代医疗体系中,病房管理是医院运营的重要组成部分。随着科技的不断进步和信息化水平的提高,传统的手工或半自动化的病房管理模式已经无法满足现代医疗服务......
  • 定时备份mysql数据库数据--mysqldump版
    前言:mysqldump是MySQL自带的逻辑备份工具,可以将整个数据库或者指定的表格导出为一个SQL脚本文件,可以用于数据库备份。1、编写shell脚本#备份文件保存路径backup_dir=/data/mysqlbackup#当前时间current_time=`date+%Y-%m-%d-%H-%M-%S`#当前年份year=`date+%Y`#......
  • MySQL - 高阶语句(二)
    目录6.子查询操作:EXISTS关键字别名as7.视图理论:操作:视图的优缺点8.NULL值9.union联级9.1union(合并后去重)9.2unionall(合并后不去重)9.3取非交集值10.case条件选择查询语句​编辑二.连接查询2.1内连接2.2左连接2.3右连接三.存储过程1......
  • Mysql数据库——高级SQL语句补充
    目录一、子查询——Subquery1.环境准备 2.In——查询已知的值的数据记录2.1子查询——Insert2.2子查询——Update2.3子查询——Delete3.NotIn——表示否定,不在子查询的结果集里3.Exists——判断查询结果集是否为空4.子查询——别名二、视图——View1.视图与表的联......