mysql按日期排序直到某个特定日期,之后按相反顺序排序

fv2wmkja  于 2021-06-23  发布在  Mysql
关注(0)|答案(5)|浏览(339)

好的,我有一张这样的table

+----+-------+------------+
| 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)和降序排序之前的所有行。

3bygqnnd

3bygqnnd1#

你应该用一个 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
kknvjkwl

kknvjkwl2#

@d-shih差点就搞定了。。。

SELECT *
FROM yourtable
ORDER BY (CASE
  WHEN `date`>"2018-07-06" THEN 'date'
  ELSE DATE("2018-07-06")
) ASC,
`date` DESC;

你可以通过工会来解决,但这很快就会变得一团糟。
您还可以将case语句实现为least()

goucqfw6

goucqfw63#

关于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型
你可能真的不需要上面所有的技巧,但我只是在不断地编这些东西。。。

bqucvtff

bqucvtff4#

使用子查询尝试此联合:

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
quhf5bfb

quhf5bfb5#

准确地知道你想要使用的日期,你可以这样做:

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中根据在union之前订购的每个项目指定了顺序。

相关问题