导读
MySQL根据不同条件计算count值,之前理解的是查询两遍SQL,两个查询条件,后面因为数据量大的缘故,为了得到那两个值,需要遍历查询两次表,后面考虑着优化下,就使用了MySQL的if()函数。
使用
原来的SQL
根据条件查询用户需求表,这里没有带有是否修复的判断。
SELECT'001' AS id,count(DISTINCT userid) AS uidFROMquery_userWHEREid = '002'AND in_time >= '2019-01-01 00:00:00.0'AND in_time <= '2019-12-17 00:00:00.0';
根据条件查询用户需求表,这里带有是否修复的判断,也就是比上述多了一个条件。
SELECT
'001' AS id,
count(DISTINCT userid) AS repairNum
FROM
query_user
WHERE
id = '002'
AND in_time >= '2019-01-01 00:00:00.0'
AND in_time <= '2019-12-17 00:00:00.0'
AND is_repair = 0;

数据量小的时候还感觉不出来,当数据量大的时候成千上百万,甚至更多,那问题就大了,在没有加索引的情况下,每次要遍历表查询,这执行两个SQL,需要遍历执行两次,销量特别慢。
优化的SQL
使用IF()函数,IF(expr1,expr2,expr3),如果expr1的值为true,则返回expr2的值,如果expr1的值为false,则返回expr3的值。
SELECT
'001' AS id,
count(DISTINCT userid) AS uid,
sum(IF((is_repair = '0'), 1, 0)) AS repairNum
FROM
query_user
WHERE
id = '002'
AND in_time >= '2019-01-01 00:00:00.0'
AND in_time <= '2019-12-17 00:00:00.0'
AND is_repair = 0;

查看执行效率,快了2s,完美解决。
查询数据并插入另一张表
INSERT INTO sys_user_role (USER_UNID, ROLE_UNID) SELECT
USER_UNID,
'2387687687687687687687678678'
FROM
sys_user,
sys_dept
WHERE
sys_user.USER_DEPTS = sys_dept.DEPT_UNID
AND sys_dept.DEPT_BELONGTO = '000'
END
MySQL还是有很多函数可以使用,目前还不是很了解的case when下次如果有遇到使用案例,在列出来吧。
