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

标签 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;

这是我的 table :

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;

如有任何帮助,我们将不胜感激。

最佳答案

在不知道错误的情况下,您无法在这里真正得到正确的答案。但正如其中一条评论所指出的,您的绑定(bind)方法可能是原因。这是一个大胆的猜测,但会不会是您没有正确绑定(bind),或者没有足够的值?

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

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

关于MySQL 混合 AND 和 OR,括号没有帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5756588/

相关文章:

javascript -/user/后显示用户名的用户信息

php - 显示带有父类别的类别表

java - 无法从 java 连接到 MySql

mysql - 如何摆脱MyISAM表的1GB开销而不锁太多系统

mysql - 从 case 语句中选择值列表

mysql left join 将行放在一起

mysql - 循环查询的结果

mysql - 请根据提到的行数告诉我哪个查询是有效的

php - 从结果行获取数组作为字段

mysql - 编码不同于utf-8的csv文件中的数据以什么编码写入mysql?