2016-07-28 9 views
1

で動作が異なります:MySQLのグループ/順序は、私はこのようになりますテーブル持っている5.7

id | text  | language_id | other_id | dateCreated 
1 | something |   1 |  5 | 2015-01-02 
2 | something |   1 |  5 | 2015-01-01 
3 | something |   2 |  5 | 2015-01-01 
4 | something |   2 |  6 | 2015-01-01 

を、私はother_id 5.

私のクエリのルックスを持つ各LANGUAGE_IDのためのすべての最新の行を取得したいですMySQLの5.6でこの

SELECT * (
    SELECT * 
    FROM tbl 
    WHERE other_id = 5 
    ORDER BY dateCreated DESC 
) AS r 
GROUP BY r.language_id 

ように私は私が欲しいものである、ID 1と3との2行を取得します。

MySQL 5.7.10ではID 2と3の2行が得られ、サブクエリのORDER BYは無視されているようです。

何が問題なのでしょうか?あなたは以下のクエリで行くべき

答えて

4

:集計機能なしGROUP BYを使用して

SELECT 
* 
FROM tbl 
INNER JOIN 
(

    SELECT 
    other_id, 
    language_id, 
    MAX(dateCreated) max_date_created 
    FROM tbl 
    WHERE other_id = 5 
    GROUP BY language_id 
) AS t 
ON tbl.language_id = t.language_id AND tbl.other_id = t.other_id AND 
    tbl.dateCreated = t.max_date_created 

は、任意の順序で行を選択します。 GROUP BYによって返される行に頼るべきではありません。 MySQLはこれを保証しません。簡単に言えば、このpost

から引用

は、MySQLは、パフォーマンスのためにGROUP BY、 から一部の列を省略することができ、しかし、これは省略 列すべてが(同じ値を持つ場合にのみ機能しますグループ内で)、そうでなければ、 の値は実際には不確定であり、正しくは がこの投稿の他の人に推測されます。 ORDER BY句 を追加しても、確定的な振る舞いの形式は再導入されません。

この例では、問題の中核ではありませんが、希望の列を明示的に列挙するのではなく、 というアイデアがよくある例です。 MySQLの5.0ドキュメントから

抜粋:この機能を使用する場合

、各グループ内のすべての行がGROUP BY部から省略されている列に対して同じ 値を有するべきです。 サーバーはグループから任意の値を返すことが自由であるため、すべての値が同じでない限り、結果は です。

関連する問題