mysql从5.5升级到5.7后的空查询

时间:2016-12-16 17:12:43

标签: php mysql laravel-4 mysql-5.7 sql-mode

我正在使用在mysql 5.5上运行的laravel 4.2应用程序。此应用程序迁移到新服务器,现在运行mysql 5.7。

升级后,一些查询现在返回空白。

我相信这与sql_mode mysql 5.7的介绍有关。

示例查询

SELECT * FROM `table1` WHERE `col1` = 'val1' and 
(SELECT count(*) FROM `table2` 
WHERE `table2`.`table1_id` = `table1`.`id` 
   and `driver_id` = '39') >= 1 and `table1`.`id` = '86' LIMIT 1

这是laravel eloquent产生的查询。它返回空。在旧的mysql 5.5上,它按预期返回一行。

如果修复了主查询中的id,则可以正常工作。

... WHERE `table2`.`table1_id` = 86 ...

正如我之前所说,我认为这与sql_mode有关。

有什么想法?

2 个答案:

答案 0 :(得分:1)

查询没有任何问题,您可以更改查询以避免问题,但这并不能解决实际问题。

解决方法是在 optimizer_switch 配置中禁用 index_merge_intersection

这是在mysql 5.7上发现的错误 https://bugs.mysql.com/bug.php?id=79675

它对我有用。

答案 1 :(得分:0)

在大多数支持它的数据库中,count(*)实际上并没有检索所有记录并对它们进行计数 - 而是取出一些只跟踪行数的元数据字段

当然,有理由期望,无论如何实施,count(*)的结果都会与更复杂但等效的查询相同。

SELECT * FROM `table1` WHERE `col1` = 'val1' and 
(SELECT count(`table2`.`id`) FROM `table2` 
WHERE `table2`.`table1_id` = `table1`.`id` 
and `driver_id` = '39') >= 1 and `table1`.`id` = '86' LIMIT 1

或获取布尔值试试这个

SELECT * FROM `table1` WHERE `col1` = 'val1' and 
(SELECT 1 FROM `table2` 
WHERE `table2`.`table1_id` = `table1`.`id` 
and `driver_id` = '39') >= 1 and `table1`.`id` = '86' LIMIT 1