MySQL 排除仅在不附带 OR 时<>比较其他列时才有效



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

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

有什么想法吗?

编辑:

尽管列 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;

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

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;

编辑:

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

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

如果用户 1 删除了他的线程,我们将他的用户 ID (1) 放入 hidden1 列中,这样他就看不到它,但另一个用户可以。 如果用户 ID 22(也参与线程)想要删除该线程,则用户 ID 22 将进入 hidden2,现在他们都看不到该线程。

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

尝试此查询并让我知道。

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 或/和优先级?


澄清: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

最新更新