上午,公司运维问我一个查询问题,给他整的抓耳挠腮,虽然能实现,但是查询效率不敢恭维就来问我了。
场景模拟
社区进行了普调,统计了社区中各位业主的(A、B、C)工具情况,如下
业主名称 | 工具类型 |
---|---|
张三 | A |
张三 | B |
张三 | C |
李四 | B |
李四 | A |
王五 | B |
赵六 | A |
孙七 | B |
周八 | B |
周八 | A |
吴九 | A |
吴九 | C |
社区领导要统计没有
C
工具的业主名称
解决方式
自然会想到差集,先查询到有该工具的,然后再排除掉这些里面有其他工具的。这样会用到 not
!
此类运算符,自然效率差的爆。那怎么解决呢?转念想一下,就想到了 case搜索函数
预设表名: table
业主名称:owner
工具:tool
SELECT * FROM (
SELECT `owner`, MAX( CASE WHEN tool ='C' THEN 1 ELSE 0 END ) AS `only_tool` FROM table GROUP BY `owner`
) t WHERE t.`only_tool` = 1
后续这个 MAX
可以看情况处理,比如没有两样的 就可以 继续使用CASE搜索函数
并用 IN
或者 EXISTS
来解决。