MySQL排除<>只有在比较其他列时没有伴随OR时才能工作

时间:2013-11-13 23:55:33

标签: mysql sql database

SQL小提琴:http://sqlfiddle.com/#!2/a2e41/8

我有一个查询,它执行了许多检查:列uidto或uidfrom是否包含给定值。这工作正常,但是当我想要排除hidden1或hidden2列包含给定值时,查询仍会返回结果。一旦我取出第一个uidto,uidfrom check,它就不会返回任何内容,这是预期的。有没有办法做所有检查?一个被忽视而有利于另一个吗?

有什么想法吗?

编辑:

尽管列hidden1包含要检查的值,但仍然会返回:

SELECT m.threadid,
m.uidto,
m.uidfrom,
m.type,
m.hidden1,
m.hidden2
FROM messages m
WHERE m.uidto = 1
OR m.uidfrom = 1
AND m.hidden1 <> 1
AND m.hidden2 <> 1
GROUP BY threadid;

这似乎尊重排除,但不检查uidfrom或uidto包含1

SELECT m.threadid,
m.uidto,
m.uidfrom,
m.type,
m.hidden1,
m.hidden2
FROM messages m
WHERE m.hidden1 <> 1
AND m.hidden2 <> 1
GROUP BY threadid;

编辑:

有几个threadid,我通过检查一个值是否匹配uidto或uidfrom来检查属于该线程中涉及的每个用户的消息(通常只有两个用户),然后检查用户id是否在hidden1或hidden2中

hidden1和hidden2列的值是选择隐藏自己的线程的用户ID。

如果用户1删除了他的线程,我们将他的用户id(1)放入hidden1列,以便他看不到,但是其他用户可以。如果用户ID 22,参与线程的人也想要删除线程,用户ID 22将进入hidden2,现在他们都不能看到该线程。

只有在其中发送消息的人或接收消息的人才能看到消息线程。没有其他人会参与其中。

1 个答案:

答案 0 :(得分:0)

尝试此查询并告诉我们。

SELECT   m.threadid,
         m.uidto,
         m.uidfrom,
         m.type,
         m.hidden1,
         m.hidden2

FROM     messages m

WHERE    (m.uidto = 1 OR m.uidfrom = 1)
         AND m.hidden1 <> 1 AND m.hidden2 <> 1

GROUP    BY threadid;

括号很重要......没有它们,它假设你的意思是这样的:

WHERE    m.uidto = 1 OR ( m.uidfrom = 1  AND m.hidden1 <> 1 AND m.hidden2 <> 1 )

并且......它由运营商的优先顺序决定!我打算更新我的答案以包含相关信息,但后来我找到了这个非常好的SO帖子,它很好地涵盖了它:Mysql or/and precedence?


澄清:http://sqlfiddle.com/#!2/5f989/26/0

select  ThreadID, 

        Type, 

        UIDto, 
        Hidden1, 

        case when UIDTo is null     and Hidden1 is not null then concat('UserTo (',Hidden1,') is hidden')
             when UIDTo is not null and Hidden1 is null     then concat('UserTo (',UIDTo,') is NOT hidden')
             else  'UserTo ('+UIDto+') status is unknown' end as UIDTo_Status,

        UIDfrom, 
        Hidden2,

        case when UIDFrom is null     and Hidden2 is not null then concat('UserTo (',Hidden2,') is hidden')
             when UIDFrom is not null and Hidden2 is null     then concat('UserTo (',UIDFrom,') is NOT Hidden')
             else  'UserTo ('+UIDfrom+') status is unknown' end as UIDfrom_Status


from    messages