代码之家  ›  专栏  ›  技术社区  ›  Umair Ayub

按日期时间排序,但将标题相同的记录放在彼此的顶部

  •  3
  • Umair Ayub  · 技术社区  · 6 年前

    test
    +---------------------+-------+
    | date_in             | title |
    +---------------------+-------+
    | 2018-01-01 00:00:00 | foo   |
    | 2018-01-02 00:00:00 | bar   |
    | 2018-01-03 00:00:00 | man   |
    | 2018-01-04 00:00:00 | foo   |
    | 2018-01-05 00:00:00 | test  |
    +---------------------+-------+
    

    我想要的结果是

    +---------------------+-------+
    | date_in             | title |
    +---------------------+-------+
    | 2018-01-05 00:00:00 | test  |
    | 2018-01-04 00:00:00 | foo   | -- see this
    | 2018-01-01 00:00:00 | foo   | -- see this
    | 2018-01-03 00:00:00 | man   |
    | 2018-01-02 00:00:00 | bar   |
    +---------------------+-------+
    

    select * from test order by title, date_in desc
    

    在这里 http://sqlfiddle.com/#!9/1dd33f/4 SQLFiddle处理模式。

    2 回复  |  直到 6 年前
        1
  •  2
  •   O. Jones    6 年前

    您正在尝试按三列排序。

    1. 标题本身
    2. 每行的输入日期

    您需要在查询中生成这三者中的第一个。要做到这一点,您需要编写一个子查询并将其连接到表中,就像它是一个虚拟表一样。

    http://sqlfiddle.com/#!9/1dd33f/23/0 )

    select min(date_in) firstdate, 
           title
      from test
     group by title
    

    你把它加入你的主桌。以下是整个查询。( http://sqlfiddle.com/#!9/1dd33f/22/0 )

    select detail.* 
      from test detail
      join  (select min(date_in) firstdate, 
                    title
                from test
               group by title
             ) firstdate on detail.title = firstdate.title 
      order by firstdate.firstdate, detail.title, detail.date_in
    

    如果子查询速度慢 尝试在上创建索引 (title, date_in) . 这种查询使用所谓的 loose index scan 而且应该相当快。

    ALTER TABLE test ADD INDEX test_title_date (title,date_in);
    
        2
  •  1
  •   Shijin TR    6 年前

    SELECT test.* FROM (select MAX(date_in) as temp_date_in,title from
    test GROUP BY title order by  date_in desc) as temp JOIN test ON
    temp.title = test.title ORDER BY temp.temp_date_in DESC,test.date_in DESC
    

    http://sqlfiddle.com/#!9/1dd33f/72