【问题标题】:Retrieve items from table that has value1 but not value2从具有 value1 但不具有 value2 的表中检索项目
【发布时间】:2018-07-09 12:14:52
【问题描述】:

我有一张桌子t1(下面是一个非常简化的真实桌子)

Name Subject Pass
A    Math    Yes
A    English  No
A    Science  No
B    Math     No
B    English  No
B    Science  No

我需要查询所有未通过任何主题的名称(通过=否)

`Select distinct(name) from t1 where Pass = 'No' and Pass 'Yes' 不工作

【问题讨论】:

    标签: mysql sql


    【解决方案1】:
    Select distinct(name) from t1 where Pass = 'No' and Pass <> 'Yes'
    

    这不起作用,因为 WHERE 子句中的表达式一次计算一行,而不是整个组。您的Pass 列不能在任何给定行上同时具有“否”和“是”值,因此上面的查询将仅过滤 Pass = 'No' 的行,而不管是否有其他行带有“是” '。

    对于您的查询的解决方案,您可以这样写:

    SELECT name
    FROM t1
    GROUP BY name
    HAVING SUM(Pass = 'Yes') = 0
    

    【讨论】:

      【解决方案2】:

      您的标题和描述并不真正匹配 - 但我假设您正在追求这样的东西(老派方法)......

      SELECT DISTINCT x.name  
                 FROM my_table x  
                 LEFT 
                 JOIN my_table y 
                   ON y.name = x.name 
                  AND y.pass = 1 -- or 'yes', if you insist
                WHERE y.name IS NULL
      

      【讨论】:

        【解决方案3】:

        我会使用聚合。假设pass 只接受这两个值:

        select name
        from t1
        group by name
        having min(pass) = 'No' and max(pass) = 'No';
        

        这会检查给定名称的唯一 pass 值是否为 'No' - 最小值和最大值相同。

        如果你有一个单独的名字表,一个更有效的版本可能是:

        select n.name
        from names n
        where not exists (select 1 from t1 where t1.name = n.name and t1.pass = 'Yes');
        

        这最适用于t1(name, pass) 上的索引。

        【讨论】:

        • 你能解释一下吗?
        • 您不是要引入HAVING 子句而不是使用where min(pass) = ... and max(pass) = ... 吗?
        • @stickybit 。 . .有时,我想知道自己在想什么。谢谢,一切都解决了。
        猜你喜欢
        • 2013-09-10
        • 1970-01-01
        • 2017-07-28
        • 2018-12-22
        • 1970-01-01
        • 1970-01-01
        • 2020-01-17
        • 2018-02-13
        • 1970-01-01
        相关资源
        最近更新 更多