MySQL混合AND和OR,括号没有帮助

时间:2011-04-22 14:45:47

标签: mysql

由于某些原因,此查询无法产生正确的结果,任何人都可以看到我是否犯了一个简单的错误。如果最糟糕的情况变得更糟,我会将它分成两个查询并使用我的应用引擎来合并结果,但这很慢而且很脏,我很乐意保持这是一个查询。

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;

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

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

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

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