2016-12-16 4 views
1

私はmysql 5.5で動作していたlaravel 4.2アプリケーションを開発中です。このアプリは新しいサーバーに移行され、現在はmysql 5.7を実行しています。mysql 5.5から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では、期待通りに1行を返します。

メインクエリからIDを修正した場合、それは機能します。

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

私が前に言ったように、これはsql_modeと関係していると思います。

どのような考えですか?それをサポートするほとんどのデータベースで

+1

where節のtable1の前に '' "がありません。 –

+0

申し訳ありませんが、私は質問を貼り付けたときにタイプミスでした。それがSQLラーベルのEloquentが再現したものです。私はプライバシーのために表と列の名前を変更しました。 – 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

関連する問題