Mysql SQL:基于两列条件选择行

Mysql SQL:基于两列条件选择行,mysql,Mysql,我想知道是否有一个优雅的SQL查询可以根据两列条件选择行 特别是,参考下面的上表,我试图返回V1列中任何“组”的所有行,该组中只有一行包含V2列中的值“1” V1 V2 V3 V4 ---------- ---------- ---------- ---------- group1 1 2 4 group1 0

我想知道是否有一个优雅的SQL查询可以根据两列条件选择行

特别是,参考下面的上表,我试图返回V1列中任何“组”的所有行,该组中只有一行包含V2列中的值“1”

    V1          V2          V3          V4
    ----------  ----------  ----------  ----------
    group1           1           2           4
    group1           0           3           5
    group1           0           2           4
    group2           0           3           5
    group2           0           2           4
    group2           0           3           5
    group3           1           2           4
    group3           0           3           5
    group3           0           2           4
    group3           0           3           5
    group4           1           2           4
    group4           1           3           5
因此,上述数据集将返回

    V1          V2          V3          V4
    ----------  ----------  ----------  ----------
    group1           1           2           4
    group1           0           3           5
    group1           0           2           4
    group3           1           2           4
    group3           0           3           5
    group3           0           2           4
    group3           0           3           5

您需要使用嵌套查询:内部查询来获取具有多个V2=1的组,外部查询来选择该组的所有记录:

SELECT *
FROM tablename AS outer
INNER JOIN (
    SELECT V1
    FROM tablename
    GROUP BY V1
    HAVING COUNT(IF(V2 = 1, 1, NULL))
) AS inner ON inner.V1 = outer.V1

同样的问题也可以用EXIST()条件来解决,但效率可能会低一些。

解决这个问题的方法多种多样。但是使用
连接
,正确的逻辑是:

SELECT t.*
FROM t JOIN
     (SELECT v1
      FROM tablename
      GROUP BY v1
      HAVING SUM(v2 = 1) = 1
     ) tt
     ON t.v1 = tt.v1;
如果
v2
仅接受值0和1,则可以使用
SUM(v2)=1

语法
SUM(v2=1)
是MySQL中的缩写。比较
v2=1
是一个返回真/假的布尔表达式。在数字上下文中(例如
SUM()
),true被视为
1
,false被视为
0

如果您只需要这是真的
v1
值,那么子查询将回答该问题。

这也将起作用:

SELECT T.* FROM TEST T JOIN (
SELECT V1, SUM(V2) AS SUMA FROM TEST
GROUP BY V1
HAVING SUM(V2) = 1
) X ON T.V1 = X.V1

你可以在这里看到结果:

我非常自豪地看到——有时——它碰巧以同样的方式思考:):)谢谢你,戈登。我非常感谢你在这个论坛上的帮助,所以我只订购了一份使用SQL和Excel(第二版)的数据分析的新副本,我期待着收到。谢谢你的帮助,我也非常感谢添加的链接!谢谢,我也非常感谢您提供的额外细节:)