我有一张这样的表
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不满足这两个条件。为混乱道歉。
答案 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');