表中的查询数据问题

时间:2010-09-20 15:14:07

标签: mysql

我的表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")

结果可能是111333

如果我应用此声明

则没有意义
select int_value from test 
where (qid = 1 and string_value = 'Red') 
and (qid = 2 and string_value = "Green")

有人可以帮助我吗?
谢谢。

4 个答案:

答案 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")