首页 > 数据库 >sql高级实践

sql高级实践

时间:2023-10-25 16:37:18浏览次数:33  
标签:risk union company 高级 实践 num sql id select

sql高级实践

情景还原:

在企业中心中,开通岗位风控的企业一共有13个,要在数据大屏中统计这13个企业的单元,事件,管控措施,任务数。

难点解析:device表,risk_unit表,risk_event表,risk_measure 只有device表有company_id。重点在于13个企业不是每个企业都有从装置往下的一个完整的数数据树的。所以有的企业必然查不出来

也就是如果IPage numPage = dataviewMapper.controlListPage(page, companyIds); // 不含有企业名称的list数据

如果页大小是20(最低13),查出来的少于13个,但是这是不被允许的吗,分页大小必须是13个(开通岗位风控的企业个数),铁定不动的。所以要想让页大小对的上,就需要在sql中认为的构造好sql。

@Override
	public IPage<CompanyControlList> controlListPage(CompanyPageVO vo, Integer govId) {
		Integer currentPage = vo.getCurrentPage();
		Integer pageSize = vo.getPageSize();
		Integer companyId = vo.getCompanyId();	
		List<Integer> companyIds = this.getPageCompanyIds(govId, companyId);
		
		IPage<ControlListNum> page = new Page<>(currentPage, pageSize);
		IPage<ControlListNum> numPage = dataviewMapper.controlListPage(page, companyIds);	// 不含有企业名称的list数据
	
		IPage<CompanyControlList> listPage = new Page<>(currentPage, pageSize);
		listPage.setTotal(numPage.getTotal());
		List<ControlListNum> nums = numPage.getRecords();
		if (CollectionUtils.isEmpty(nums)) {
			return listPage;
		}
		
		Set<Integer> existCompanyIds = nums.stream().map(ControlListNum::getCompanyId).collect(Collectors.toSet());
		Map<Integer, String> idNameMap = dubboCompanyService.getCompanyNameMap(new ArrayList<>(existCompanyIds));
		
		List<CompanyControlList> companyControlLists = new ArrayList<>();					// 构造含有企业名称的list数据
		CompanyControlList controlList;
		for (ControlListNum num : nums) {
			controlList = new CompanyControlList();
			controlList.setCompanyName(idNameMap.get(num.getCompanyId()));
			controlList.setUnitNum(num.getUnitNum());
			controlList.setEventNum(num.getEventNum());
			controlList.setMeasureNum(num.getMeasureNum());
			controlList.setTaskNum(num.getMeasureNum());
			companyControlLists.add(controlList);
		}
		listPage.setRecords(companyControlLists);
		return listPage;
	}

sql解析

首先构造好一个13个企业的a表。

image-20231025161520474

以这个表为基本表连接 同样道理组件起来的b表:

image-20231025161401303

b表少了几个企业,但是没关系,因为a表左连接b表后,会将少的企业补齐:

image-20231025161501562

select a.company_id, 
 	ifnull(b.unit_num,0) as unit_num, 
 	ifnull(b.event_num,0)as event_num , 
 	ifnull(b.measure_num,0)as measure_num from
	(
		  select 845 as company_id union
		  select 813 as company_id union
		  select 207 as company_id union
		  select 95 as company_id union
		  select 122 as company_id union
		  select 288 as company_id union
		  select 164 as company_id union
		  select 131 as company_id union
		  select 195 as company_id union
		  select 87 as company_id union
		  select 151 as company_id union
		  select 287 as company_id union
		  select 285 as company_id union
		  select 17 as company_id 	 
 	)a
 left join(
	 select 
	   d.company_id,
	   count(distinct ru.id) as unit_num,
	   count(distinct re.id) as event_num,
	   count(distinct rm.id) as measure_num
	  from device d 
	  left join risk_unit ru on
	   d.id = ru.device_id
	  left join risk_event re on
	   re.risk_unit_id = ru.id
	  left join risk_measure rm on
	   rm.risk_event_id = re.id
	  where
	    d.deleted = 0
	   and ru.deleted = 0
	   and re.deleted = 0
	   and rm.deleted = 0
	    and d.company_id in
	    (845, 813, 207, 95, 122, 288, 164, 131, 195, 87, 151, 287, 285, 17)
	  group by d.company_id
 
 ) b  on a.company_id = b.company_id
group by a.company_id

标签:risk,union,company,高级,实践,num,sql,id,select
From: https://www.cnblogs.com/zheng-s/p/17787508.html

相关文章

  • sql 审核工具 archery
    这里使用git下载gitclonehttps://gitee.com/rtttte/Archery.git使用docker-compose进行部署cdArchery/src/docker-compose执行部署命令docker-compose-fdocker-compose.ymlup-d初始化操作#表结构初始化dockerexec-tiarchery/bin/bashcd/opt/arche......
  • 多款国产操作系统安装数据库干货文档汇总(含Oracle/MySQL/国产数据库等)
    随着国产化的逐步推进,越来越多的企业选择将数据库安装在国产操作系统上。为帮助大家了解国产操作系统上的数据库成功搭建案例与搭建方式,本文整理了墨天轮数据技术社区上用户分享的实操文档,涵盖银河麒麟、中标麒麟、统信UOS、openEuler等常见的国产操作系统,数据库以Oracle为主,此外......
  • MySQL
    MySQL概述MySQL连接语法mysql -u用户名 -p密码[-h数据库服务器IP地址 -p端口号]关系型数据库:(RDBMS)建立在关系模型基础上,由多张相互连接的二维表组成的数据库特点:使用表存储数据,格式统一,便于维护使用SQL语言操作,标准统一,使用方便,可以用于复杂......
  • Kettle链接SqlServer+Jdk8 问题解决
     这两天要弄个ldap对接,客户端server2016,数据库那边winserver2008,数据库也是2008最开是链接出现类似这样的,更换了链接mssql的Jar版本,从12换到了6的老版本,没用。  后来更改网上提示的  C:\ProgramFiles\Java\jre-1.8\lib\security\java.security文件jdk.tls.......
  • MySQL
    数据库的基础数据库新系统 数据与信息联系数据和信息之间是相互联系的。数据是反映客观事物属性的记录,是信息的具体表现形式。数据经过加工处理之后,就成为信息;而信息需要经过数字化转变成数据才能存储和传输。数据库存储单元--服务器数据库系统的构成存......
  • Can't connect to local MySQL server through socket '/tmp/mysql.sock'
    Can'tconnecttolocalMySQLserverthroughsocket'/tmp/mysql.sock' 删除配置文件后重启servicemysql restart  root316191014:06?00:00:00/bin/sh/home/mysql/bin/mysqld_safe--datadir=/home/mysql/data--pid-file=/home/mysql/data/localhos......
  • MySQL 常用配置及备份脚本
    1.查看配置文件位置 mysql--verbose--help|grepmy.cnf2.给一个用户赋予权限GRANTALLONradiansdb.*TO'admin'@'%';3.显示权限SHOWGRANTSFOR'admin'@'%';4.MySql会读取多个my.cnfMySql不仅会读取设置的默认配置文件,如果设置的默认配置不是/etc/m......
  • 功能不够,SQL来凑,修改数据库的正确姿势?
    修改数据库是一项关键任务,需要小心谨慎地执行,以确保数据的完整性和准确性。下面是一个详细的步骤指南,介绍了正确修改数据库的姿势。第一步:备份数据库在进行任何数据库修改之前,务必备份数据库。这样,如果发生意外情况,可以恢复到修改之前的状态。使用数据库管理工具或命令行工具创......
  • MySQL 有哪些常见的面试题
    MySQL是一种常用的关系型数据库管理系统,在面试过程中经常会涉及与MySQL相关的问题。以下是一些常见的MySQL面试题:1.介绍一下MySQL和其他数据库管理系统的区别。  -MySQL是开源的,其他商业数据库管理系统(如Oracle、MicrosoftSQLServer)需要购买许可证。  -My......
  • 如何用MySQL快速导入sql数据?
     在MySQL中,可以使用多种方法来快速导入SQL数据。以下是一些常用的方法和技巧,以帮助你在MySQL中快速导入大量的SQL数据。1.使用mysql命令行工具  -将SQL文件保存到本地计算机上。  -打开终端或命令提示符窗口,并导航到mysql命令行工具所在的路径。 ......