2016-01-09 18 views
7

MySQLのバージョン5.7のようですが、SQL Serverを扱う人には実際のheadacheという1つの厄介なものが追加されました。MySQLでDISTINCTとORDER BYを選択

問題は:SELECT DISTINCTの列を1列にしようとすると、MySQLがエラーをスローし、ORDER BYの別の列が欲しいです。これまではバージョン5.6ではバージョン5.7のいくつかのビルドであってもこれを行うことができましたが、今は禁止されています(少なくともデフォルトでは)。

いくつかの変数が存在することを願っています。これを動作させるために設定できる変数があります。しかし、残念ながら私はその不快な変数を知らない。誰かがそれを知っていれば幸いです。

EDIT

これは(MySQLの5.7の最終ビルドまで)年間、文字通り働いていた私の場合はいくつかの典型的なクエリです:私は今b.id_orderが含まれている場合、実際に、

SELECT DISTINCT a.attr_one, a.attr_two, a.attr_three, b.attr_four FROM table_one a 
LEFT JOIN table_two b ON b.some_idx = a.idx 
ORDER BY b.id_order 

そして、 SELECT部分(MySQLが示唆しているように)に、私が得るものは、ごみになります。

+0

ため

は、これは実際のクエリですか? – Strawberry

+0

はい、実際のクエリです。 – Jacobian

答えて

7

を使用するかどうかを選択する必要があり、 DISTINCT句はGROUP BYの特殊なケースと考えることができます。例えば、

ONLY_FULL_GROUP_BY

のMySQL 5.7.5とまでは関数依存性の検出を実装しています。 ONLY_FULL_GROUP_BY SQLモードが有効になっている場合(デフォルトで)、SELECTリスト、HAVING条件、またはORDER BYリストがGROUP BY句で名前が指定されておらず、機能に依存しない非集約カラムを参照するクエリは拒否されますそれらの上に。 (5.7.5前に、MySQLは機能的な依存関係を検出しないとONLY_FULL_GROUP_BYは、デフォルトでは有効になっていません。あらかじめ5.7.5行動の説明について)

ONLY_FULL_GROUP_BYが無効になっている場合は、標準のSQLの使用に対するMySQLの拡張GROUP BYを使用すると、列が機能的にGROUP BY列に依存していない場合でも、選択リスト、HAVING条件、またはORDER BYリストで非集約列を参照できます。これにより、MySQLは前述のクエリを受け入れます。この場合、サーバーは各グループから任意の値を自由に選択できるので、同じ値でないと選択された値は不確定です。これはおそらくあなたが望むものではありません。さらに、各グループからの値の選択は、ORDER BY句を追加することによって影響を受けることはありません。結果セットのソートは、値が選択された後に行われ、ORDER BYはサーバーが選択する各グループ内のどの値に影響を与えません。 ONLY_FULL_GROUP_BYを無効にすると、主に、データの一部のプロパティのために、GROUP BYで名前が付けられていない各集約されていない列のすべての値が各グループで同じであることがわかっている場合に役立ちます。よりhttp://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by

特定の回答のため

SELECT DISTINCT attr_one, 
      attr_two, 
      attr_three, 
      attr_four 
FROM 
    (SELECT a.attr_one, 
     a.attr_two, 
     a.attr_three, 
     b.attr_four 
    FROM table_one a 
    LEFT JOIN table_two b ON b.some_idx = a.idx 
    ORDER BY b.id_order) tmp 
+2

私はそれを知っています。 'my.cnf'の' sql_mode'を '' ''に設定して 'ONLY_FULL_GROUP_BY'を無効にしましたが、' DISTINCT'と 'ORDER BY'のこの問題はこれで解決されません。 – Jacobian

+0

あなたのSQLバージョンは何ですか?max_sort_lengthを試しましたか? – developerCK

+0

バージョンは5.7.10です。この変数を試してみるとどういう意味ですか? – Jacobian

0

私があなたが言及したリンクの投稿を読んだところ、エラーがなぜスローされたのか、それを回避する方法の明確な説明が与えられたようです。あなたは(もちろんテストしていません)次のことを試してみたいことがありますあなたの場合は

SELECT a.attr_one, a.attr_two, a.attr_three, b.attr_four 
FROM table_one a 
LEFT JOIN table_two b ON b.some_idx = a.idx 
GROUP BY a.attr_one, a.attr_two, a.attr_three, b.attr_four 
ORDER BY max(b.id_order) 

あなたは、ほとんどの場合ORDER BY max(b.id_order)、または​​やほかの集計関数

+0

これはMySQLでは動作しません。私がMySQLで誤解されていない場合は、結果セットが最初にORDERされ、その後にGROUPが実行されるという保証はありません。 – Jacobian

+0

ORDER BY節を追加することで、各グループの値の選択に影響を与えることはできません。結果セットのソートは、値が選択された後に行われ、ORDER BYは各グループ内のどの値私はそれを知っています。 – Jacobian