Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 按日期时间排序,但将标题相同的记录放在彼此的顶部_Mysql - Fatal编程技术网

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

Mysql 按日期时间排序,但将标题相同的记录放在彼此的顶部,mysql,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 0

我有一张桌子

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

这里是SQLFIDLE模式。

您试图按三列排序

  • 每个标题首次出现的日期
  • 标题本身
  • 每行的输入日期
  • 您需要在查询中生成这三个选项中的第一个。为此,您需要编写一个子查询并将其连接到表中,就像它是一个虚拟表一样

    这个子查询实现了这一点。它为每个标题提供一行,显示标题出现的第一个日期。()

    你把它加入你的主桌。这是整个问题。()

    如果子查询速度慢请尝试在
    (title,date\u in)
    上创建索引。这种类型的查询使用所谓的

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

    试试这个查询,这是使用子查询,如果这不是问题,你可以试试这个

    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
    

    此子查询需要花费超过100k条记录的时间。我想知道是否有更好的解决方案,我想我还是用我以前的解决方案吧,那就是
    在DESC
    中按标题顺序按日期从表GROUP中选择GROUP\u CONCAT(title),然后分解分组结果,但如果有MySQL解决方案,我还是很想听到。请参阅我的编辑。而且,如果您仍然存在性能问题,那么可以查看
    EXPLAIN
    输出,甚至提出另一个问题。此子查询需要花费超过100k条记录的时间。我想知道是否有更好的解决方案存储过程有什么用吗?
    ALTER TABLE test ADD INDEX test_title_date (title,date_in);
    
    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