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



好的,所以我有一张这样的表格

+----+-------+------------+
| 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,但要么我不知道如何使用它,要么它不接受每个SELECT中指定的ORDER BY子句。

编辑:我可能没有很好地解释自己。在我的查询中,我需要它按日期升序排序特定日期(>=某个日期,在这种情况下,让我们使用2018-07-15(之后的所有行,并且之前的所有行都按降序排序。

你应该使用单个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

参考 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

你可能真的不需要上面显示的所有技术,但我只是在编造这些东西......

尝试使用子查询进行此联合:

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

@D-Shih几乎做对了...

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

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

你也可以将 CASE 语句实现为 MINIMUM((

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

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 中指定了顺序。

相关内容

  • 没有找到相关文章

最新更新