1

我正在开发一个在 mysql 5.5 上运行的 laravel 4.2 应用程序。这个应用程序迁移到一个新的服务器,现在运行一个 mysql 5.7。

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

我相信这与mysql 5.7引入的sql_mode有关。

示例查询

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 有关。

有什么想法吗?

4

2 回答 2

1

查询没有问题,确实可以更改查询以避免问题,但这并不能解决真正的问题。

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

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

它对我有用。

于 2016-12-19T14:24:22.123 回答
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
于 2016-12-17T05:48:23.347 回答