2017-02-17 7 views
0

の乗馬の上に、私は、このSQL文を実行している:sql_modeの= ONLY_FULL_GROUP_BYが、オプションなしの場合

SELECT 
    *, GROUP_CONCAT(contact) AS contact 
FROM 
    table4, table3, table2, table1 
WHERE 
    table1.id = 1 
    AND table2.var_id = table1.id 
    AND table3.var_id = table1.id 
GROUP BY 
    table1.id 

はエラーを取得:

GROUP_CONCAT(contact)" doit récupérer les contact de la table4

それは私がこの使用という理由だけで動作します:

set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'; 

私の問題は、私の要求が別のサーバで使われなければならないということです。 問題。

オプションを超過しないで同じ結果を取得するにはどうすればよいですか?

Expression #%u of %s is not in GROUP BY clause and contains nonaggregated column '%s' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

エラーが各テーブルに自分自身を繰り返し、私は尋ねた要素を追加した場合、私の結果は何の連結連絡先だけが最初の「接触」の結果を持っていません。

+1

タグとGROUP_CONCAT?無効な組み合わせ... – jarlh

+0

集計列を選択しないようにクエリを修正できます。これをリファクタにとって良い時期と考えてください。これを行うと、モードがどこにあるのかは関係ありません。どこでも動くからです。 –

+1

その他のコメント:古いスタイルの結合を使用しています。また、 'table4'にクロス結合しているようです。 –

答えて

1

すべての列を選択してもフルモードエラーが発生しないように、クエリを再構成できます。このようなもの:

SELECT * 
FROM table1 t1 
INNER JOIN table2 t2 
    ON t1.id = t2.var_id 
LEFT JOIN 
(
    SELECT var_id, GROUP_CONCAT(contact) AS contact 
    FROM table3 
    GROUP BY var_id 
) t3 
    ON t2.var_id = t3.var_id 

このテーブルのみを含むサブクエリで集計を実行すると、問題が回避されます。あなたが私たちに示した質問に固執しませんでした。なぜなら、それははっきりしていないからです。いずれにせよ、これはあなたが試すことができるもののアイデアを与えることを願っています。

+0

素晴らしい。私は自分のGROUP_CONCATにLEFT JOINを使用しなければならなかったので、連絡先が見つからなければ何らかの結果が得られます。それ以外の場合はINNER JOINとは何も得られません。 –

+0

サブクエリで「LEFT JOIN」に変更しました。デフォルトのプレースホルダで置き換えるのに 'NULL 'かもしれないそれらのフィールドに' COALESCE() 'を使うことができます。 –

+0

あなたの前の質問は間違っていませんでした。あなたの探している結果に依存しています。私はCOALESCE()を調べます。 –

関連する問題