【问题标题】:Need to filter out conditional values from MySql table需要从 MySql 表中过滤掉条件值
【发布时间】:2022-01-06 10:23:16
【问题描述】:

我坚持这种情况,我需要根据这种逻辑提取 ID。

在本例中,我想在输出中提取以下组合:

  • 在以下情况下包括结果:
  1. 来源具有以下一种或多种组合 - Raja、Ravi 或 Sam

  • 在以下情况下排除 ID:
  1. 来源有一个或多个组合 - Jane、Jake 或 Jude。
ID Source
1 Raja
1 Ravi
2 Sam
2 Raja
3 Jake
3 Raja
3 Sam
3 Jane
4 Sam
4 Jake
4 Jude

输出,我期望为:

ID
1
2

这个源表对于每个 id 总是有多个源值。

提前致谢。

【问题讨论】:

    标签: mysql sql group-by sum having


    【解决方案1】:

    使用聚合并在HAVING子句中设置条件:

    SELECT ID
    FROM tablename
    GROUP BY ID
    HAVING SUM(Source IN ('Raja', 'Ravi', 'Sam')) > 0
       AND SUM(Source IN ('Jane', 'Jake', 'Jude')) = 0;
    

    请参阅demo

    【讨论】:

    • 这似乎按预期工作。您能否解释一下 SUM 是如何在这里与 > 和 = 0 一起工作的。谢谢。
    • @RaghavendraGupta Source IN ('Raja', 'Ravi', 'Sam')Source IN ('Jane', 'Jake', 'Jude') 是布尔表达式,1 表示真,0 表示假。所以 SUM 对所有 1 求和,这意味着它仅在每个布尔表达式为真时才计数。
    • @RaghavendraGupta 当SUM(Source IN ('Raja', 'Ravi', 'Sam'))> 0 时,这意味着对于此ID,列表中至少有1 行带有Source。当SUM(Source IN ('Jane', 'Jake', 'Jude'))= 0 时,表示对于此ID,列表中没有Source 所在的行。
    • 出于好奇,你能分享一下我可能做错了什么吗?从表 T GROUP BY ID 中选择 ID where ((Source = 'Ravi' AND Source = 'Raja') OR (Source = 'Ravi' AND Source = 'Sam') OR (Source = 'Raja' AND Source = 'Sam' ) OR (Source = 'Ravi' AND Source = 'Raja' AND Source = 'Sam') ) AND Source NOT IN ('Jake', 'Jane', 'Jude')
    • @RaghavendraGupta 是的,这就是为什么在 HAVING 子句中有 2 个条件。
    【解决方案2】:

    一个使用 EXISTS 和 NOT EXISTS 的好例子。

    这是一种方法

    select distinct t.id
      from table t
    where exists (select 1
                    from table t2
                   where t2.id=t.id
                     and t2.name in ('Raja','Ravi','Sam')
     and not exists(select 1
                      from table t3
                     where t3.id=t.id
                       and t3.name in ('Jane','Jake','Jude')
                    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      相关资源
      最近更新 更多