首页 > 解决方案 > 按日期时间排序,但将具有相同 TITLE 的记录彼此重叠

问题描述

我有桌子

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 与架构。

标签: mysql

解决方案


您正在尝试按三列排序。

  1. 每个标题首次出现的 date_in。
  2. 标题本身
  3. 每行的 date_in

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

这个子查询可以解决问题。它为每个标题提供一行,显示标题出现的第一个日期。(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). 这种查询使用所谓的松散索引扫描,并且应该相当快。

ALTER TABLE test ADD INDEX test_title_date (title,date_in);

推荐阅读