虽然数据是正确的,但是意外的查询

时间:2013-08-08 14:54:03

标签: mysql sql database mysqli

我已经关注两个表格来发送消息传递功能 -

message2_recips 表格:

mid seq uid status
1   1   1   N
1   1   503 A

message2

mid seq created_on           created_on_ip  created_by  body
1   1   2013-08-08 19:17:44   1.2.2.1       503          some_random_text

我正在解雇此查询 -

SELECT m.mid, m.seq, m.created_ON, m.created_by, m.body, r.status 
        FROM message2_recips r
INNER JOIN message2 m ON m.mid=r.mid AND m.seq=r.seq 
WHERE r.uid=503 AND r.status in ('A', 'N') AND r.seq=(SELECT max(rr.seq) 
        FROM message2_recips rr 
WHERE rr.mid=m.mid AND rr.status in ('A', 'N')) AND IF (m.seq=1 AND m.created_by=503, 1=0, 1=1)
ORDER BY created_ON DESC

预期结果是 -

mid seq created_on                  created_by  body                status
1   1   2013-08-08 19:17:44          503        some_random_text    A

但它返回零结果

但是,如果我从查询中删除if条件IF (m.seq=1 AND m.created_by=503, 1=0, 1=1),我会得到正确的结果。但在观察message2表中的数据后,查询中的条件满足且应该有效。

我无法弄清楚可能的原因。任何关于出错和如何纠正的指示都会非常有帮助。


所述查询确实如下,

它获得当前用户发起/接收的对话,从其他表获取消息内容。它会收到Delete以外ActiveNew以外的状态的邮件。它使用最大序列号过滤我们与最新消息的对话。每条消息都有自己的序列号,并且增加了时尚。

这确实有效,但由于这是针对消息传递的收件箱功能,我希望用户能够看到自己发起的对话。现在上面的查询工作不正常,他只有在收到其他用户的回复后才能看到他发起的对话。

1 个答案:

答案 0 :(得分:2)

您的预期结果符合IF的条件:

IF (m.seq=1 AND m.created_by=503, 1=0, 1=1)

因此上面的表达式返回1=0,这是假的,因此忽略了行。

更具可读性可能只是将其添加到WHERE子句中:

AND NOT (m.seq=1 AND m.created_by=503)

如果您的意图是原始IF为真,请删除NOT