SQL:根据2列标准选择行

时间:2017-11-12 12:45:34

标签: mysql

我想知道是否有一个优雅的SQL查询来根据2列标准选择行。

特别是,参考下面的顶部表格,我试图返回任何'组的所有行。在列V1中,该组恰好包含该组的一行,其中包含值' 1'在V2列中。

    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

3 个答案:

答案 0 :(得分:1)

有多种方法可以解决这个问题。但是使用JOIN,正确的逻辑是:

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是一个返回true / false的布尔表达式。在数字上下文(例如SUM())中,真差被视为1,而falses被视为0

如果您只想要v1值,那么子查询就会回答这个问题。

答案 1 :(得分:0)

您需要使用嵌套查询:内部查询以获取具有多个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()条件也可以解决同样的问题,但效率可能会低一些。

答案 2 :(得分:0)

这也有效:

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

您可以在此处查看结果:http://sqlfiddle.com/#!9/50c15/11