9

id、title、timestamp、category_id列名を持つMySQLデータベース(ブログ)があります。最新のタイムスタンプを持つ各カテゴリから1つの行を選択するにはどうすればよいですか?カテゴリ1、2、1に3つの行がある場合、最初に「1」のカテゴリのタイムスタンプが最も高い2つの行が返され、2番目にカテゴリ「2」の行が返されます。

私は試した:

SELECT title, timestamp, category_id
FROM blogs 
WHERE timestamp IN (
  SELECT MAX(timestamp) 
  FROM blogs 
  GROUP BY category_id
)

ただし、タイムスタンプは一意ではないため、たとえば、内部のselectステートメントで選択されたcategory_id=2の行と同じタイムスタンプを持つcategory_id=1の追加の行をプルすることができます。

4

2 に答える 2

10

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.titleMAX(b.title) AS titleこれは、行から単一の列を返す場合に機能します。

行を特定の順序で返す場合は、ORDERBY句を追加します。


于 2012-08-02T18:04:47.553 に答える
0

この方法も試すことができます。私がMYSQL5.6で試したとき、私のために働きます。category_idのタイムスタンプと昇順が最も高い2つのカテゴリを返します。

SELECT title、timestamp、category_id FROM blogs WHERE timestamp in(select max(timestamp)from blogs group by category_id)group by timestamp、category_id order by category_id asc;

于 2016-03-16T16:47:05.897 に答える