分组后 排除存在某种情况的 的查询
上午,公司运维问我一个查询问题,给他整的抓耳挠腮,虽然能实现,但是查询效率不敢恭维就来问我了。
场景模拟
社区进行了普调,统计了社区中各位业主的(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来解决。

浙公网安备 33010602011771号