2011-04-22 34 views
2

由于某种原因,这个查询不会产生正确的结果,任何人都可以看到我是否犯了一个简单的错误。如果最坏的情况变得更糟,我会把它分成两个查询,并使用我的应用程序引擎合并结果,但这是缓慢和肮脏的,我很想保持这是一个查询。MySQL混合AND's和OR's,括号不起作用

SELECT * 
FROM `chat_messages` 
WHERE 
(
(`from` = :me AND `to` = :them AND `from_clear` = FALSE) OR 
(`from` = :them AND `to` = :me AND `to_clear` = FALSE) 
) 
ORDER BY `time` ASC; 

这是我的表:

CREATE TABLE `chat_messages` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `from` varchar(16) NOT NULL, 
    `to` varchar(16) NOT NULL, 
    `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    `message` text NOT NULL, 
    `read` tinyint(1) NOT NULL DEFAULT '0', 
    `from_clear` tinyint(1) NOT NULL DEFAULT '0', 
    `to_clear` tinyint(1) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`), 
    KEY `from` (`from`), 
    KEY `to` (`to`), 
    KEY `time` (`time`), 
    KEY `read` (`read`), 
    KEY `from_clear` (`from_clear`), 
    KEY `to_clear` (`to_clear`) 
) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=latin1; 

任何帮助将非常感激。

+0

你到底要与上面的查询做什么? – 2011-04-22 14:51:49

+0

首先你不需要'WHERE'后面的第一个paranthese和最后一个,'ORDER BY'前面。其次,它的意思是:“不会产生正确的结果”?你能详细说明吗? – 2011-04-22 14:53:40

+0

为了帮助你,你应该让我们知道你期待的结果,以及你实际得到的结果。看起来查询会用'from_clear'错误的方式向我们发送消息,或者使用'to_clear'错误向我发送消息给我。那实际上是你想要做什么?什么不起作用? – 2011-04-22 15:46:15

回答

0

不知道错误,你不能在这里真正得到正确的答案。但正如其中一条评论所指出的,你的绑定方法可能是原因。这是一个疯狂的猜测,但它可能是你没有正确地绑定,或者没有足够的价值?

尝试硬编码您的语句中的值。我敢打赌它是有效的,然后你可以处理绑定问题。有时你必须有两个变量,而不是一个被命名两次,但这取决于。换句话说,你可能必须尝试:

(`from` = :me_1 AND `to` = :them_1 AND `from_clear` = FALSE) OR 
(`from` = :them_2 AND `to` = :me_2 AND `to_clear` = FALSE) 
+0

我正在使用PDO库进行绑定。我试图做的是获得两个用户之间还没有被清除的所有消息。 sql没有正确地返回消息列表,当一个人清除他们的列表时,它会搞砸他们的两个列表。 MJB解决方案起作用,它必须是多重绑定的问题。 – mrkmg 2011-04-22 18:25:48

相关问题