导读


MySQL根据不同条件计算count值,之前理解的是查询两遍SQL,两个查询条件,后面因为数据量大的缘故,为了得到那两个值,需要遍历查询两次表,后面考虑着优化下,就使用了MySQL的if()函数。

使用


原来的SQL

根据条件查询用户需求表,这里没有带有是否修复的判断。

  1. SELECT
  2. '001' AS id,
  3. count(DISTINCT userid) AS uid
  4. FROM
  5. query_user
  6. WHERE
  7. id = '002'
  8. AND in_time >= '2019-01-01 00:00:00.0'
  9. 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;

image.png
数据量小的时候还感觉不出来,当数据量大的时候成千上百万,甚至更多,那问题就大了,在没有加索引的情况下,每次要遍历表查询,这执行两个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;

image.png

查看执行效率,快了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下次如果有遇到使用案例,在列出来吧。