2017-05-13 2 views
0

ONLY_FULL_GROUP_BY私は次のクエリ(UPDATED下記参照)があります。のMySQL =

SELECT 

i0_.id AS id_0, 
i0_.address AS address_1, 
i1_.name AS name_2, 
c2_.name AS name_3, 
c3_.code AS code_4, 
l4_.iso AS iso_5, 
c5_.id AS id_6, 
c6_.name AS name_7, 
i7_.identifier AS identifier_8 

FROM institutions i0_ 
LEFT JOIN institution_languages i1_ ON (i1_.institution_id = i0_.id) 
LEFT JOIN countries c3_ ON (c3_.id = i0_.country_id) 
LEFT JOIN country_languages c2_ ON (c2_.country_id = c3_.id) 
LEFT JOIN country_spoken_languages c8_ ON (c8_.country_id = c3_.id) 
LEFT JOIN cities c5_ ON (c5_.id = i0_.city_id) 
LEFT JOIN city_languages c6_ ON (c6_.city_id = c5_.id) 
LEFT JOIN languages l4_ ON (l4_.id = i1_.language_id) 
LEFT JOIN institution_types i7_ ON (i0_.institution_type_id = i7_.id) 

WHERE c8_.is_primary = 1 
AND c8_.language_id = l4_.id 
AND c2_.language_id = 546 
AND i7_.identifier = "work_place" 
GROUP BY id_6 #here is the issue... 

UPDATEDクエリ

SELECT 
i0_.id AS id_0, 
i0_.address AS address_1, 
i1_.name AS name_2, 
c2_.name AS name_3, 
c3_.code AS code_4, 
c4_.name AS name_5, 
i5_.identifier AS identifier_6 

FROM institutions i0_ 

LEFT JOIN institution_languages i1_ ON (i1_.institution_id = i0_.id) 
LEFT JOIN countries c3_ ON (c3_.id = i0_.country_id) 
LEFT JOIN country_languages c2_ ON (c2_.country_id = c3_.id AND c2_.language_id = ?) 
LEFT JOIN country_spoken_languages c6_ ON (c6_.country_id = c3_.id AND c6_.language_id = ? AND c6_.is_primary = ?) 
LEFT JOIN city_languages c4_ ON (c4_.city_id = i0_.city_id) 
LEFT JOIN institution_types i5_ ON (i0_.institution_type_id = i5_.id) 

WHERE i5_.identifier = ? 
GROUP BY i0_.city_id 

このクエリは、I GROUP_BYで問題が発生しています解決方法がわからない:

10 55 - SELECTリストの式#1がGROUP BY句になく、クラスタ化されていないカラム 'database.i0_.id'を含んでいます。

GROUP BY句のカラムに依存します。これはsql_modeのと互換性 ある=

ONLY_FULL_GROUP_BY私は、これは簡単にONLY_FULL_GROUP_BYをオフに設定することで解決することができます知っているが、私はそれを動作させるために私のクエリに何を行うことができ、適切ではなく、私のサーバー上でのMySQLの設定を変更すること? previuos versioneで

+2

'c5_.id '以外の' SELECT'にすべての列を集約関数に入れることができます。あなたが得ているエラーは、これを行うように指示するものです。他の列も削除することができます。 –

+0

あなたの左のジョインはあなたの 'where'句がそれらを内側のジョインに変えるので余分です。 –

答えて

2

あなたはsql_modeのを変更しないしたい場合=

ONLY_FULL_GROUP_BYあなたは、単に(例えば分(によってグループに関与していない列にaggegation機能を追加することができます)またはMAX()

(この列の結果はimpredictableだった。このように、あなたはこれらの列の値を取得するためのルールを割り当てる)

SELECT 
    i0_.id AS id_0, 
    min(i0_.address AS) address_1, 
    min(i1_.name) AS name_2, 
    min(c2_.name)AS name_3, 
    min(c3_.code) AS code_4, 
    min(c4_.name) AS name_5, 
    min(i5_.identifier) AS identifier_6 

FROM institutions i0_ 

LEFT JOIN institution_languages i1_ ON (i1_.institution_id = i0_.id) 
LEFT JOIN countries c3_ ON (c3_.id = i0_.country_id) 
LEFT JOIN country_languages c2_ ON (c2_.country_id = c3_.id AND c2_.language_id = ?) 
LEFT JOIN country_spoken_languages c6_ ON (c6_.country_id = c3_.id AND c6_.language_id = ? AND c6_.is_primary = ?) 
LEFT JOIN city_languages c4_ ON (c4_.city_id = i0_.city_id) 
LEFT JOIN institution_types i5_ ON (i0_.institution_type_id = i5_.id) 

WHERE i5_.identifier = ? 
GROUP BY i0_.city_id 
0

なるほど、クエリが動作するためにあなたが選択フィールドに少なくとも集約関数に使うべきだと思います私はサンプルデータベース 'claを試してみました顧客テーブルから 'ssicmodels' と '受注':

select c.customerNumber, sum(o.orderNumber) 
from customers c 
join orders o 
on(c.customerNumber = o.customerNumber) 
group by c.customerNumber; 

結果が返されますが、私は機能を削除する場合は、 '()' outはのようにある合計:

ERROR 1055

(42000):式SELECTリストの#2はGROUP BY句にはなく、GROUP BY句のカラムに機能的に依存しない非集約カラム 'classicmodels.o.orderNumber'を含みます。これはsql_mode = only_full_group_byと互換性がありません