我的表test
包含4个字段
+----+-----------+--------------+-----+
| id | int_value | string_value | qid |
+----+-----------+--------------+-----+
| 1 | 111 | Red | 1 |
| 2 | 111 | Green | 2 |
| 3 | 111 | Blue | 3 |
| 4 | 222 | Yellow | 1 |
| 5 | 222 | Red | 2 |
| 6 | 333 | Red | 1 |
| 7 | 333 | Green | 2 |
+----+-----------+--------------+-----+
我想查询匹配流动约束的int_value
。
(qid = 1 and string_value = 'Red') and (qid = 2 and string_value = "Green")
结果可能是111
和333
如果我应用此声明
则没有意义select int_value from test
where (qid = 1 and string_value = 'Red')
and (qid = 2 and string_value = "Green")
有人可以帮助我吗?
谢谢。
答案 0 :(得分:4)
而不是约束,我认为你的意思是条件。您需要使用OR
,因为没有一行可以满足您编写的所有WHERE
条件:
select int_value
from test
where (qid = 1 and string_value = 'Red')
or (qid = 2 and string_value = "Green")
如果你想让int_values满足这两个条件,你可以这样做:
select int_value
from test
where (qid = 1 and string_value = 'Red')
or (qid = 2 and string_value = "Green")
group by int_value
having count(concat(distinct qid, string_value)) = 2
答案 1 :(得分:2)
您可以使用COUNT的技巧:
SELECT int_value
FROM test
WHERE (
(qid = 1 AND string_value = 'Red')
OR (qid = 2 AND string_value = 'Green')
)
GROUP BY int_value
HAVING COUNT(DISTINCT qid, string_value) = 2
但这完全没有经过测试,所以我不确定语法是否正确。基本上它通过int_value对结果进行分组,并找到任何组,其中结果与不同的情况一样多。您需要使HAVING
子句中的数值与OR
替代项的数量相匹配。
答案 2 :(得分:1)
可能不是最干净的方法:
select T1.int_value
from test T1
where exists ( select T2.int_value
from test T2
where T2.int_value = T1.int_value
and T2.qid = 1
and T2.string_value = 'Red'
)
and exists ( select T3.int_value
from test T3
where T3.int_value = T1.int_value
and T3.qid = 2
and T3.string_value = 'Green'
)
答案 3 :(得分:1)
了解问题......
考虑一下你的疑问。如果你拿走括号(因为所有条件都是'和'),它将如下所示:
select int_value from test
where qid = 1 and string_value = 'Red'
and qid = 2 and string_value = "Green"
此外,'和'具有相似的乘法属性:因子的顺序不影响结果,因此我们可以执行以下操作:
select int_value from test
where qid = 1 and qid = 2
and string_value = "Green" and string_value = 'Red'
正如你所看到的那样,不可能单个记录可能qid等于1 和 2;这只是不合逻辑的。 string_value也是一样。
简单回答 因此,使用OR的其他解决方案是正确的(qid记录我等于1或2)。为了让您的生活更轻松,这里的简短答案也可以消除重复:
select distinct int_value from test
where (qid = 1 and string_value = 'Red')
or (qid = 2 and string_value = "Green")