MySQL从5.5升级到5.7后空查询



我正在使用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雄辩产生的查询。它返回空。在旧的mysql 5.5上,它按预期返回一行。

如果从主查询中修复了ID,则可以工作。

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

正如我之前说的那样,我相信这与sql_mode有关。

有什么想法吗?

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

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

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

它对我有用。

在大多数支持它的数据库中,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

相关内容

  • 没有找到相关文章

最新更新