按日期时间排序,但保留具有相同TITLE的记录

时间:2018-09-01 12:38:40

标签: mysql

我有类似的桌子

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 个答案:

答案 0 :(得分:2)

您尝试按三列进行订购。

  1. 每个标题首次出现的日期。
  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)上创建索引。这种查询使用所谓的loose index scan,并且应该相当快。

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

答案 1 :(得分:1)

尝试此查询,这是使用子查询,如果那不是问题,则可以尝试

var user = UserInput.Text;
// user is just a string
await _connection.InsertAsync(user);

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