1

重複の可能性:
列の最大値を持つ行を取得します

特定のタイムスタンプで人々と彼らが所有する株式数の監査テーブルがあります。特定の ID の最新のレコードを取得するにはどうすればよいですか?

mysql 監査テーブル

id name shares  dateadded 
1  Abc  12      2012-10-06 12:18:21
2  Klm  23      2012-10-06 12:18:21
3  Jim  45      2012-10-06 12:18:21
1  Abc  35      2012-11-06 12:18:21
1  Abc  65      2012-11-17 12:18:21
2  Klm  13      2012-11-06 12:18:21

私の希望の出力:

id name shares  dateadded 
1  Abc  65      2012-11-17 12:18:21
2  Klm  13      2012-11-06 12:18:21
3  Jim  45      2012-10-06 12:18:21

私はこのようなことができます:

select a.* from audittable a join audittable b 
on a.id = b.id
where a.dateadded > b.dateadded;

しかし、これにより、繰り返されている最新のレコードのみが得られます。この場合、ID は 1,2 であり、3 ではありません。サブクエリや一時テーブルを使用せずに、すべての ID の最新レコードのリストを取得するにはどうすればよいですか?

4

2 に答える 2

5

サブクエリは必要ですが、サブセレクトは必要ありません (パフォーマンスが大幅に低下します)。

JOINidandMAX(dateadded)集計を返すサブクエリに対して。サブクエリ結合は、最新のタイムスタンプを含む行の他のすべての列値と一致できるようにするために必要です。

SELECT
  audittable.id,
  name,
  shares,
  audittable.dateadded
FROM
  audittable
  /* Subquery returns id dateadded grouped by id */
  JOIN (
    SELECT id, MAX(dateadded) AS dateadded FROM audittable GROUP BY id
    /* JOIN condition is on both id and dateadded between the two tables */
  ) maxtimestamp ON audittable.id = maxtimestamp.id AND audittable.dateadded = maxtimestamp.dateadded

ここにSQLfiddleのデモがあります

于 2012-11-21T17:26:28.060 に答える
2

サブクエリがなければ、これに限定されます

SELECT id, MAX(dateAdded)
FROM audittable
GROUP BY id

他の列が必要な場合は、Michael Berkowski's answer のようなサブクエリが必要です

于 2012-11-21T17:24:58.750 に答える