mysql统计所有分类下的数量,没有的也要展示
要求统计所有分类下的数量,如果分类下没有对应的数据也要展示。这种问题在日常的开发中很常见,每次写每次忘,所以在此记录下。
这种统计往往不能直接group by,因为有些类别可能没有对应的数据
这里有两个思路:
每种类型分别统计,用union 连接(比较适合类型已知、不多且确定的)不知道还有没有更好的方法
过UNION操作符组合了三个独立的查询,每个查询都基于数据表计算了不同条件下的数量,简单粗暴,但不是很推荐
SELECT `status` `key`,COUNT(id) amount FROM device_patrol_task_record WHERE `status` IS NULL
UNION
SELECT 1 `key`,COUNT(id) amount FROM device_patrol_task_record WHERE `status` = 1
UNION
SELECT 2 `key`,COUNT(id) amount FROM device_patrol_task_record WHERE `status` = 2
UNION
SELECT 3 `key`,COUNT(id) amount FROM device_patrol_task_record 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 device_patrol_task_record 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的优势会更加明显,因为可以利用索引加速查询过程。
先查类型表,left join数据表,最后对left join后的数据再进行分组,注意:要给右表(数据表)为空时判断
和第一个的优化版思路是一样的
SELECT
a.id `key`,
a.classify_name `name`,
COUNT(b.id) `count`
FROM
dispatch_pre_plan_classify_configuration a
LEFT JOIN dispatch_emergency b ON b.`level` = a.id
GROUP BY a.id
mysql统计所有分类下的数量,没有的也要展示的更多相关文章
- java基础 File与递归练习 使用文件过滤器筛选将指定文件夹下的小于200K的小文件获取并打印按层次打印(包括所有子文件夹的文件) 多层文件夹情况统计文件和文件夹的数量 统计已知类型的数量 未知类型的数量
package com.swift.kuozhan; import java.io.File; import java.io.FileFilter; /*使用文件过滤器筛选将指定文件夹下的小于200K ...
- 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效
数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...
- MySQL统计信息简介
作者:王小龙@网易乐得DBA 原文地址: http://mp.weixin.qq.com/s/698g5lm9CWqbU0B_p0nLMw MySQL执行SQL会经过SQL解析和查询优化的过程,解析器 ...
- mysql获取所有分类的前n条记录的两种方法浅析
项目中有个需求是获取出展会分类下的前n条展商. 刚开始的思路是用group by 获取出展会的分类,后面再根据分类获取该分类下的n个展商,但也需要第一次获取出展会的时候也获取所有的每个展会分类下的 ...
- 【夯实Mysql基础】MySQL在Linux系统下配置文件及日志详解
本文地址 分享提纲: 1. 概述 2. 详解配置文件 3. 详解日志 1.概述 MySQL配置文件在Windows下叫my.ini,在MySQL的安装根目录下:在Linux下叫my.cnf,该文件位于 ...
- MySQL在Linux系统下配置文件详解
在日常的的开发过程中接触到了SQLServer和MySQL数据库的操作性问题,可能是以前接触的都是SQL Server,才开始接触MySQL,总感觉使用MySQL没有使用SQLserver那么顺手,一 ...
- {MySQL存储引擎介绍}一 存储引擎解释 二 MySQL存储引擎分类 三 不同存储引擎的使用
MySQL存储引擎介绍 MySQL之存储引擎 本节目录 一 存储引擎解释 二 MySQL存储引擎分类 三 不同存储引擎的使用 一 存储引擎解释 首先确定一点,存储引擎的概念是MySQL里面才有的,不是 ...
- Mysql 统计查询
SELECT ub.telphone, SUM(IF(b.type = 1 AND b.level = 1, 1, 0)) AS type11, SUM(IF(b.type = 1 AND b.lev ...
- mysql统计天、周、月、季度、半年、年
之前在网上搜索按时间统计,发现不是很全 ,接着别人的思路进行延伸下, mysql统计天.周.月.季度.半年.年 前期工作创建辅助表 CREATE TABLE num (i INT); ),(),(), ...
- woocommerce分类页产品数量修改
我们用woocommerce建商城,不同的模板分类页产品数量不同,如果想要显示更多或更少的数量要如何修改呢?很简单,一行代码就能搞定!打开当前主题的function.php文件,加入如下代码,把18改 ...
随机推荐
- Centos8 安装 Redis6.0.16
下载,解压,编译,安装 安装至 /opt/redis/redis-6.0.16 目录 tar xvf redis-6.0.16.tar.gz gcc --version cd redis-6.0.16 ...
- Java I/O 教程(四) FileInputStream 类
Java FileInputStream class 从一个文件读取字节数据. 用于从图像,音频,视频等文件中读取字节类型数据. 类定义 public class FileInputStream ex ...
- 【MongoDB】MongoDB原理分析、集群搭建(Docker)与简单使用
一.MongoDB 简介 MongoDB是一个基于分布式文件存储的数据库,介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最像关系数据库的.其目的是为WEB应用提供可扩展的高性能数据存 ...
- Taurus.MVC WebMVC 入门开发教程4:数据列表绑定List<Model>
前言: 在本篇 Taurus.MVC WebMVC 入门开发教程的第四篇文章中, 我们将学习如何实现数据列表的绑定,通过使用 List<Model> 来展示多个数据项. 我们将继续使用 T ...
- 前后端分离项目(七):实现"添加"功能(前端视图)
好家伙,本篇用于测试"添加"接口,为后续"用户注册"功能做铺垫 (完整代码在最后) 我们要实现"添加"功能 老样子我们先来理清一下思路, ...
- ECMA Script Module(ES module)知识点
1.每个 ES Module 都是运行在单独的私有作用,ESM 自动采用严格模式,忽略use strict <script type="module">console. ...
- 【Azure Redis 缓存】Azure Redis服务开启了SSL(6380端口), PHP如何访问缓存呢?
问题描述 使用6379端口连接Azure Redis服务,连接失败.因为默认情况下Azure Redis的设置没有打开6379的端口.需要使用SSL(6380端口)进行连接,但是遇见了无法连接的问题. ...
- 【Azure Developer】使用REST API获取Activity Logs、传入Data Lake的数据格式问题
问题一:. 如何在用REST API获取活动日志时,控制输出的项? [答]参考REST API对于获取活动日志的说明接口,在参数是$filter和$select中可以分别控制过滤条件和输出项 GET ...
- 探索Terraform实践:优化基础设施管理
Terraform 是管理基础设施及代码(IaC)最常用的工具之一,它能使我们安全且可预测地对基础设施应用更改. Terraform作为一个强大的基础设施即代码工具,为开发人员和运维团队提供了一种简单 ...
- sqlmap 绕过WAF
1.基本的语法 sqlmap 更新 sqlmap -update 具体的使用方法: sqlmap -u url --current-user sqlmap -u url --current-db s ...