如何使用多个条件获取查询结果?

时间:2012-04-30 12:17:39

标签: mysql sql

我有一张这样的表

Table
-----
userid
fieldid
fieldvalue

其中userid和fieldid是此表的主键对。

我想创建一个sql查询,查找fieldvalue等于所选fieldid的某些内容的所有用户

例如,对于值

fieldid: 817
fieldvalue: 'yes'

我可以使用如下的SQL查询:

select userid FROM table where (fieldid=817 AND fieldvalue='yes') 

此查询正常。

但是,如果我有第二个或第三个标准,则进行查询 像这样:

select userid 
FROM table 
where (fieldid=817 AND fieldvalue='yes')
AND (fieldid=818 AND fieldvalue='no') 

返回一个空结果,但条件满足 个人标准。

有没有办法纠正这个?

更新

我忘记写下一个用例(appologies)

userid, fieldid, fieldvalue
1 , 817, yes
1, 818, no
1, 825, yes 
2, 817, yes 
2, 818, yes
3, 829, no

对于这个表,我想要一个sql查询,找到满足以下条件的用户:fieldid 817的值为yes,fieldid 818的值为no

到目前为止,我使用OR建议,要求fieldid 817的值为yes,或者fieldid 818的值为no

我希望两个条件都得到满足。在上面,预期的结果将是

userid
1

而不是

userid
1
2 

由于用户标识2不满足这两个条件。为混乱道歉。

6 个答案:

答案 0 :(得分:2)

您应该在不同的标准之间使用OR

SELECT userid 
FROM table 
WHERE (fieldid=817 AND fieldvalue='yes')
    OR (fieldid=818 AND fieldvalue='no')

使用AND/OR

之间的区别
  

AND运算符显示第一个条件和第一个条件的记录   第二个条件是真的。

     

如果是第一个条件,则OR运算符显示记录   第二个条件是真的。

编辑:根据您的评论,您可以通过以下方式进行操作

select t1.userid 
FROM temp t1
where (t1.fieldid=817 AND t1.fieldvalue='yes') 
    AND EXISTS (SELECT userid 
            FROM temp t 
            WHERE t.userid =  t1.userid 
                AND fieldid=818 
                AND fieldvalue='no') 

查看带有工作副本的sqlfiddle

甚至是这样

select t1.userid 
FROM temp t1
left join temp t2
    on t1.userid = t2.userid
where (t1.fieldid=817 AND t1.fieldvalue='yes')
    AND t2.fieldid=818 AND t2.fieldvalue='no'

这是另一个sqlfiddle

如果您想要加入更多字段,那么您将执行以下操作:

select t1.userid 
FROM temp t1
left join temp t2
    on t1.userid = t2.userid
left join temp t3
    on t1.userid = t3.userid
where (t1.fieldid=817 AND t1.fieldvalue='yes')
    AND (t2.fieldid=818 AND t2.fieldvalue='no')
    AND (t3.fieldid=819 AND t3.fieldvalue='no')

答案 1 :(得分:0)

尝试使用OR

select userid FROM table where (fieldid=817 AND fieldvalue='yes') OR(fieldid=818 AND fieldvalue='no')

您的查询要求fieldid为817和818,这是不可能的。

答案 2 :(得分:0)

您应该在OR子句中使用AND而不是WHERE。请查看此link以获得快速简便的解释。

答案 3 :(得分:0)

您好请在OR

的地方尝试AND
select userid FROM table where (fieldid=817 AND fieldvalue='yes') OR (fieldid=818 AND fieldvalue='no')

如果您使用AND,则会检查是否必须满足条件fieldid=817 AND fieldvalue='yes'fieldid=818 AND fieldvalue='no',但这是不可能的。如果您在两个条件之间使用OR运算符,那么它将给出具有两个条件的结果..

感谢

答案 4 :(得分:0)

除了使用OR的许多建议(完全正确)之外,您还可以使用IN(如果缩放,可能会使查询更具可读性)。

SELECT userid FROM table WHERE (fieldid, fieldvalue) IN (
  (817, 'yes'),
  (818, 'no' )
);

要查找满足两个条件的所有userid,您需要将table自我加入自身:

SELECT userid
FROM table AS t1 JOIN table AS t2 USING (userid)
WHERE
      (t1.fieldid = '817' AND t1.fieldvalue = 'yes')
  AND (t2.fieldid = '818' AND t2.fieldvalue = 'no' )

答案 5 :(得分:0)

你需要使用它:

select userid 
FROM table 
where fieldid in (817, 818) and fieldvalue in ('yes', 'no');