2016-07-29 4 views
1
+------+---------+--------+---------+---------+---------+ 
| id | user_id | obj_id | created | applied | content | 
+------+---------+--------+---------+---------+---------+ 
| 1 |  1 |  1 |  1 |  1 | ...  | 
| 2 |  1 |  2 |  1 |  1 | ...  | 
| 3 |  1 |  1 |  1 |  2 | ...  | 
| 4 |  1 |  2 |  2 |  2 | ...  | 
| 5 |  2 |  1 |  1 |  1 | ...  | 
| 6 |  2 |  2 |  1 |  1 | ...  | 
+------+---------+--------+---------+---------+---------+ 

私は上記と同様の表を持っています。 id,およびobj_idは外部キーです。 createdおよびappliedは、整数として格納されたタイムスタンプです。 user_idobj_idでグループ化し、最大値をappliedとする行全体を取得する必要があります。 2つの行の値が同じappliedの場合、最大値はcreatedにする必要があります。したがって、上記のデータのために、私の所望の出力は次のようになります。2番目の列にフォールバックしてMySQLの列を最大にする

+------+---------+--------+---------+---------+---------+ 
| id | user_id | obj_id | created | applied | content | 
+------+---------+--------+---------+---------+---------+ 
| 1 |  1 |  1 |  1 |  1 | ...  | 
| 4 |  1 |  2 |  2 |  2 | ...  | 
| 5 |  2 |  1 |  1 |  1 | ...  | 
| 6 |  2 |  2 |  1 |  1 | ...  | 
+------+---------+--------+---------+---------+---------+ 

私の現在のソリューションは、applied順すべてcreated得ることです:

select * from data order by applied desc created desc; 

を、コードで物事を整理、この表には、取得します非常に大きいと私は必要なデータを取得するSQLソリューションが欲しいです。

+0

ASCIIアートの場合は➕1。 CVEのために:最初のクエリを追加してください。 –

+0

@LinusKleenどういう意味ですか?私が現在使っているクエリ、または上記のデータを複製するクエリ? –

+0

申し訳ありません。 "イニシャル"のように: "あなたが困っているもの" –

答えて

0

コメントのMark Heintzのおかげで、this answerは私が必要とする場所に私を連れて来ました。

SELECT 
    data.id, 
    data.user_id, 
    data.obj_id, 
    data.created, 
    data.applied, 
    data.content 
FROM data 
LEFT JOIN data next_max_applied ON 
    next_max_applied.user_id = data.user_id AND 
    next_max_applied.obj_id = data.obj_id AND (
     next_max_applied.applied > data.applied OR (
      next_max_applied.applied = data.applied AND 
      next_max_applied.created > data.created 
     ) 
    ) 
WHERE next_max_applied.applied IS NULL 
GROUP BY user_id, obj_id; 

どのように動作するかについての詳細は、解説を参照してください。 left joinは、同じユーザーとオブジェクトに対して最近適用された行を検索しようとします。存在しない場合は、同時に適用された行がありますが、最近作成された行があります。

これは、新しい行がない行は、next_max_applied.appliedの値がnullになることを意味します。これらの行は、IS NULL節でフィルタリングされます。

最後に、group by句は、同じuser、object、appliedおよびcreatedカラムを持つ行を処理します。

0
select * 
from my_table 
where id in (
    /* inner subquery b */ 
    select max(id) 
     from my_table where 
     (user_id, obj_id, applied, created) in (
      /* inner subquery A */ 
      select user_id, obj_id, max(applied), max(created) 
      from my_table 
      group by user_id, obj_id 
    ) 
); 

そして内部サブクエリAはuser_id, obj_id, max(applied), max(created)を有する(別個の)行を返します。これらをin節で使用すると、サブクエリBはuser_id、obj_id、max(適用)、max(作成)の適切な値を持つ行を再現した単一のIDのリストを取得します。結果を得るための有効なIDのコレクションがあります。

主な選択肢は、必要な結果を選択するためにこれらのIDを使用します。

+0

説明を追加しました – scaisEdge

関連する問題