3

我有一张这样的桌子

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 

由于 userid 2 不满足这两个条件。为混乱道歉。

4

6 回答 6

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')
于 2012-04-30T12:20:31.420 回答
0

你需要像这样使用它:

select userid 
FROM table 
where fieldid in (817, 818) and fieldvalue in ('yes', 'no');
于 2012-04-30T12:25:25.897 回答
0

你应该在你的子句中使用ORnot 。查看此链接以获得快速简便的解释。ANDWHERE

于 2012-04-30T12:20:41.913 回答
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在两个条件之间使用运算符时,它将给出具有两个条件的结果..

谢谢

于 2012-04-30T12:20:49.563 回答
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' )
于 2012-04-30T12:22:02.807 回答
0

尝试使用或

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

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

于 2012-04-30T12:19:40.820 回答