2016-11-11 8 views
0

表:MySQLの - IDの下で選択した行、列の値によってグループ最新のタイムスタンプを持ってい

---------------------------------------------------- 
ID | field_name | field_value | timestamp 
---------------------------------------------------- 
2 | postcode | LS1   | 2016-11-09 16:45:15 
2 | age  | 34   | 2016-11-09 16:45:22 
2 | job  | Scientist | 2016-11-09 16:45:27 
2 | age  | 38   | 2016-11-09 16:46:40 
7 | postcode | LS5   | 2016-11-09 16:47:05 
7 | age  | 24   | 2016-11-09 16:47:44  

誰かが私にいくつかのポインタを与えることができれば、私は上記のデータに基づいて、疑問に思う、私はしたいと思いますID2でクエリを実行し、一意のフィールド名ごとに行を戻します(同じフィールド名を持つ同じIDの下に複数の行が存在する場合は、最新のタイムスタンプの行を返します)。

field_nameをグループ化することでほぼ達成できました。これは一意の行のリストを返しますが、必ずしも最新の行ではありません。

SELECT * FROM fragment WHERE (id = :id) GROUP BY field_name 

私は本当に私はここで行う必要があり、まさに上の任意のポインタのために感謝されると、どのように私は、このクエリで

感謝をMAX(タイムスタンプ)の線に沿って何かを合うことができます!

答えて

1

まず、各IDのデータセット、最大タイムスタンプを持つFieldNameが必要であると考えてください。 (そのセットを生成する)をインライン・ビュー(以下のB)として表示します。次に、このセット(B)をベースセットに戻して、内部結合によって不要な行を除去できるようにします。

SELECT A.ID, A.field_name, A.field_value, A.timestamp 
FROM Table A 
INNER JOIN (SELECT ID, field_name, MAX(timestamp) TS 
      FROM table 
      GROUP BY ID, field_name) B 
on A.ID = B.ID 
and A.field_name = B.field_name 
and A.timestamp = B.TS 

のMySQLの外で、これはあなたが各レコードに行番号を割り当てるなど、これらの> 1何かを排除することができるだろうと窓/分析機能を使用して行うことができます....

SELECT B.* 
FROM (SELECT A.ID 
      , A.field_name 
      , A.field_Vale 
      , A.timestamp 
      , Rownumber() over (Order by A.timestamp Desc) RN 
     FROM Table A) B 
WHERE B.RN = 1 

または制限または上部を含む交差適用を使用することができる。

+0

おかげ例えば多くは、私は私のクエリにあなたのロジックを適用し、B(セット)の下で、私はまた私が欲しいIDを渡すためにWHEREを追加しました返すには、説明と追加の例のおかげで、私は確かにここでMySQLを使って作業していますが、非常に明確です。ありがとうございます。 –

1

最も単純な方法を行うには:

SELECT * 
    FROM fragment fra1 
    WHERE (id = :id) 
    and timestamp = (select max(timestamp) 
        from fragment fra2 
        where fra2.id = fra1.id 
         and fra2.field_name = fra1.field_name) 
    GROUP BY field_name 
+1

内部選択に 'field_name'を含める必要があります。 –

+0

外部グループはなぜ(「選択*」に集約されないのですか?それ以外の場合、相関サブクエリは動作するように見えます。 – xQbert

+0

編集を確認してください:あなたは1つの '=' comparationに2つのフィールドを入れることはできません –

関連する問題