mysql - 按日期时间排序,但将具有相同 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 与架构。
解决方案
您正在尝试按三列排序。
- 每个标题首次出现的 date_in。
- 标题本身
- 每行的 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);
推荐阅读
- haskell - 在 Haskell 中转换后创建字符串列表的问题
- c - 用C语言交换号码系统?
- typescript - 打字稿中的自定义 npm 包:找不到自定义接口的名称
- .htaccess - Apache 2.4 重写 url
- javascript - 如果触摸,否则如果单击,否则
- python - 递归删除偶数的相邻重复字母的代码
- javascript - 递归 Python 函数转换为 Javascript 不起作用,数组有问题
- ruby-on-rails - 使用助手重构我的索引视图代码
- python-3.x - 列表索引超出范围-在python中
- batch-file - 使用 set /p 不接受值的批处理奇怪问题