これは次のように簡略化できます(ORDER BY
サブクエリでは役に立たない):
SELECT *
FROM table
GROUP BY title
なぜJOIN
が必要だと思いますか ? (わかりました、これはコメントによって解決されました。)
すべてのタイトル、タイムスタンプが最大の行に必要なコメントの後、これで作業が完了します:
SELECT t.*
FROM
table AS t
JOIN
( SELECT title
, MAX(timestamp) AS maxts
FROM table
GROUP BY title
) AS grp
ON grp.title = t.title
AND grp.maxts = t.timestamp
ORDER BY t.timestamp DESC
記録のために、元のクエリ:
SELECT *
FROM
( SELECT *
FROM table
ORDER BY timestamp DESC
) m
GROUP BY title
かもしれない 期待どおりに機能しますが、のみ SELECT
で使用できるMySQLの GROUP BY
にないフィールドを一覧表示します 句(またはそれらに依存)、それらに集約関数はありません。したがって、上記のクエリは多かれ少なかれランダムを返します すべてのタイトルの行。実際、タイトルの最初の行が返されます。したがって、最初にサブクエリを実行します(timestamp DESC
で順序付けます )結果として、タイムスタンプが最大の行が最初に検索されます。
ただし、これは、オプティマイザがサブクエリが役に立たないことを理解していないためにのみ発生します。ある日MySQLバージョン7.5にアップグレードすると、元のクエリが正常に実行され、クエリが以前と同じように機能しなくなる場合があります。 (オプティマイザーがより巧妙になり、サブ選択なしでクエリをより単純なものに変換したためです。)
MySQLが将来のリリースでGROUP BY
のSQL標準に準拠することを決定した場合、クエリが完全に機能しなくなり、エラーが発生する可能性もあります。 クエリ。