MySQLの場合、このクエリは指定した結果セットを返します。
SELECT b.title
, MAX(b.timestamp)
, b.category_id
FROM blogs b
GROUP BY b.category_id
同じ最新の「タイムスタンプ」を持つカテゴリに複数の「タイトル」がある場合、そのカテゴリの1つの行のみが返されるため、カテゴリごとに1つの「タイトル」のみが返されます。
注:他のDBMSシステムは、GROUP BYに表示されないSELECTリスト内の非集計を処理するため、上記のようなクエリで例外(エラー)をスローします。
あなたの質問は非常に近かった。各カテゴリの「最新の」タイムスタンプを返す内部クエリはすでにあります。次のステップは、category_idとその最新のタイムスタンプを返すことです。
SELECT category_id, MAX(timestamp) AS timestamp
FROM blogs
GROUP BY category_id
次のステップは、それに結合してblogs
、関連付けられた「タイトル」を取得することです。
SELECT b.title
, b.timestamp
, b.category_id
FROM (SELECT category_id, MAX(timestamp) AS timestamp
FROM blogs
GROUP BY category_id
) l
JOIN blogs b
ON b.category_id = l.category_id AND b.timestamp = l.timestamp
注:カテゴリに複数の「最新の」行がある場合(タイムスタンプ値が一致する場合)、このクエリは両方を返します。
それが懸念される場合は、クエリを変更(または別の方法で記述)して、カテゴリに2行が含まれる可能性を防ぐことができます。
そのクエリにGROUPBY句を追加するだけで機能します(MySQLのみで、他のDBMSでは機能しません)
SELECT b.title
, b.timestamp
, b.category_id
FROM (SELECT category_id, MAX(timestamp) AS timestamp
FROM blogs
GROUP BY category_id
) l
JOIN blogs b
ON b.category_id = l.category_id AND b.timestamp = l.timestamp
GROUP BY b.timestamp, b.category_id
(他のDBMSの場合、SELECTリストを変更して、に置き換えることができますb.title
。MAX(b.title) AS title
これは、行から単一の列を返す場合に機能します。
行を特定の順序で返す場合は、ORDERBY句を追加します。