zoukankan      html  css  js  c++  java
  • 分组后 排除存在某种情况的 的查询

    上午,公司运维问我一个查询问题,给他整的抓耳挠腮,虽然能实现,但是查询效率不敢恭维就来问我了。

    场景模拟

    社区进行了普调,统计了社区中各位业主的(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来解决。

  • 相关阅读:
    LCA算法
    poj1364(差分约束系统)
    dij算法为什么不能处理负权,以及dij算法变种
    差分约束系统
    最短路专辑
    LightOJ1348 树链剖分
    FZU2082树链剖分
    HYSBZ1036 树链剖分
    poj3237 树链剖分 暴力
    poj2763 树链剖分(线段树)
  • 原文地址:https://www.cnblogs.com/akashicbrother/p/15043450.html
Copyright © 2011-2022 走看看