我想知道是否有一个优雅的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
答案 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