2017-12-10 16 views
1

とIDの順結果、私は多くのことを試してみましたが、私はこれを行う方法を把握することはできません。のMySQL - 直近の日付

私は(一意ではない)のIDと日付を持つテーブルがあります。すべてのエントリは最後に選択する必要がありますが、ソートする必要があります。

表:私は必要なもの

+----+------------+ 
| id | date | 
+----+------------+ 
| 1 | 2017-12-10 | 
| 1 | 2015-05-22 | 
| 7 | 2016-04-05 | 
| 2 | 2017-12-12 | 
| 2 | 2014-03-10 | 
| 7 | 2016-01-14 | 
| 1 | 2016-08-17 | 
+----+------------+ 

+----+------------+ 
| id | date | 
+----+------------+ 
| 2 | 2017-12-12 | 
| 2 | 2014-03-10 | 
| 1 | 2017-12-10 | 
| 1 | 2016-08-17 | 
| 1 | 2015-05-22 | 
| 7 | 2016-04-05 | 
| 7 | 2016-01-14 | 
+----+------------+ 

私はそれにリンクされている最新の日付を持つIDで始まり、IDSによってすべて "グループ化" が必要。

id:2/date:2017-12-12 は最新の日付を持つため、id 2のすべての行が次に降順で並べられます。その後、次に来るIDの「ブロック」は、直近の次の日付などによって再び決定されます。

アイデア?ありがとう:)

答えて

2

であれば、ソースデータにこれを参加することにすべての行の上に私たちの最大の日付を与えます並び替え。

SQL Fiddle

のMySQL 5.6スキーマのセットアップ

CREATE TABLE Table1 
    (`id` int, `date` datetime) 
; 

INSERT INTO Table1 
    (`id`, `date`) 
VALUES 
    (1, '2017-12-10 00:00:00'), 
    (1, '2015-05-22 00:00:00'), 
    (7, '2016-04-05 00:00:00'), 
    (2, '2017-12-12 00:00:00'), 
    (2, '2014-03-10 00:00:00'), 
    (7, '2016-01-14 00:00:00'), 
    (1, '2016-08-17 00:00:00') 
; 

クエリ1

select t.* 
from table1 t 
inner join (
    select id, max(`date`) maxdate 
    from table1 
    group by id 
) g on t.id = g.id 
order by g.maxdate DESC, t.id, t.date DESC 

Results

| id |     date | 
|----|----------------------| 
| 2 | 2017-12-12T00:00:00Z | 
| 2 | 2014-03-10T00:00:00Z | 
| 1 | 2017-12-10T00:00:00Z | 
| 1 | 2016-08-17T00:00:00Z | 
| 1 | 2015-05-22T00:00:00Z | 
| 7 | 2016-04-05T00:00:00Z | 
| 7 | 2016-01-14T00:00:00Z | 
+0

私はそれを実装し、それは魅力のように動作します!私はいくつかのサブクエリとグループ化を使わなければならないと思っていましたが、自分でそこに着くことはできませんでした。どうもありがとう! – Fidelis

-1

あなたのテーブルには、IDによるグループは、我々は最大の日付を取得することをサブクエリを使用しstack

SELECT * FROM `stack` LEFT OUTER JOIN (SELECT * FROM `stack` GROUP BY `id`)t1 ON 
`stack`.`id` = t1.`id` ORDER BY t1.`date` DESC,`stack`.`date` DESC