2016-12-16 103 views
1

我正在使用運行在mysql 5.5上的laravel 4.2應用程序。這個應用程序遷移到一個新的服務器,現在運行一個MySQL 5.7。將MySQL從5.5升級到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口才產生一個查詢。它返回空。在舊的MySQL 5.5中,它按預期返回一行。

如果修復了主查詢中的id,它就起作用了。

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

正如我之前所說,我認爲這是與sql_mode有關。

有什麼想法?

+1

「'」在where子句中的table1之前缺少。 –

+0

對不起,當我貼上問題時,這是一個錯字。這就是Laravel雄辯的重現。我只是改變了表和名字的隱私。 – cmancre

+0

如果我將「count(*)」更改爲「count('table'.'id')」,它就會起作用。搖鈴? – cmancre

回答

1

沒有什麼錯的查詢,這是真的,您可以更改查詢,以避免這個問題,但不解決實際問題。

的解決方案是在optimizer_switch配置以禁用index_merge_intersection

這是在MySQL 5.7 https://bugs.mysql.com/bug.php?id=79675

它爲我找到了一個錯誤。

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 
+0

我明白了,但這是Laravel Eloquent ORM轉載的代碼。 我相信解決方案是在sql_mode配置上。我現在有默認設置。你怎麼看? – cmancre

相關問題