MySQL按日期顺序排列,直到特定日期为止,之后按相反顺序排列

时间:2018-08-14 08:19:05

标签: php mysql sql mysql-workbench navicat

好,所以我有一张这样的桌子

+----+-------+------------+
| id | title |    date    |
+----+-------+------------+
|  1 | aaa   | 2018-08-13 |
|  2 | bbb   | 2018-08-02 |
|  3 | ccc   | 2018-07-06 |
|  4 | ddd   | 2018-07-16 |
|  5 | fff   | 2018-07-13 |
+----+-------+------------+

我想按日期列升序对它进行排序,但只等到特定日期后,再对它进行降序排序,就像这样

+----+-------+------------+
| id | title |    date    |
+----+-------+------------+
|  4 | ddd   | 2018-07-16 |
|  2 | bbb   | 2018-08-02 |
|  1 | aaa   | 2018-08-13 |
|  5 | fff   | 2018-07-13 |
|  3 | ccc   | 2018-07-06 |
+----+-------+------------+

我以为我可以使用UNION,但是我不知道如何使用它,或者它不接受每个ORDER BY中指定的SELECT子句。

编辑:我可能没有很好地解释自己。在我的查询中,我将需要此命令按日期升序排序特定日期(> =某个日期,在这种情况下,请使用2018-07-15)之后的所有行,然后对所有行进行降序排序。

5 个答案:

答案 0 :(得分:2)

关于D-Shih奠定的基础...

SELECT id
     , title
     , date
  FROM 
     ( SELECT *
            , CASE WHEN date <'2018-07-15' THEN @i:=0 ELSE @i:=@i+1 END i
         FROM t
            , (SELECT @i:=0) vars
        ORDER  
           BY date
     ) x
 ORDER
    BY i=0, i, date DESC;

http://sqlfiddle.com/#!9/58a8ac/20

您可能实际上并不需要上面显示的所有技术,但是随着我的前进,我只是在整理这些东西...

答案 1 :(得分:2)

您应该使用单个order by且没有子查询来完成此操作:

order by (case when date >= @date then 1 else 0 end),  -- put more recent first
         (case when date >= @date then date end) asc,  -- order the first group ascending
         date desc  -- order by second group descending

答案 2 :(得分:0)

使用子查询尝试此联合:

select * from 
(select *,ord=0 from tablename where id=2
union
select *,ord=1 from tablename where id<>2)a
order by ord asc, date desc

答案 3 :(得分:0)

确切地知道您要使用的日期,您可以这样做:

SELECT * FROM (
    SELECT 
        concat(1,'-',@firstquery := @firstquery + 1) as rownum, table_name.* 
    FROM 
        table_name, 
        (SELECT @firstquery:=0) fq 
    WHERE 
        date_column <= '2018-08-05' 
    ORDER BY 
        date_column ASC) a
UNION ALL 
SELECT * FROM (
    SELECT 
        concat(2,'-',@secondquery := @secondquery + 1) as rownum, table_name.* 
    FROM 
        table_name, 
        (SELECT @secondquery:=0) sq 
    WHERE 
        date_column > '2018-08-05' 
    ORDER BY 
        date_column DESC) b
ORDER BY rownum ASC

它很大,但是在这种情况下,我要根据每个子查询模拟行号,并将其连接起来以便以后进行排序。意味着您有时也可以向后订购。

我喜欢这一点的原因是,我们根据联合之前的每个订单项在rownum中指定了订单。

答案 4 :(得分:0)

@ D-Shih几乎正确了...

table

您可以使用UNION来做到这一点,但这很快就会变得混乱。

您还可以将CASE语句实现为LEAST()