MySQL 按日期排序直到特定日期,之后反向排序
MySQL order by date until a specific date, after it reverse order
好的,所以我有一个 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
,但我不知道如何使用它,或者它不接受每个 SELECT
中指定的 ORDER BY
子句。
编辑: 我可能没有很好地解释自己。在我的查询中,我需要它按日期对特定日期之后的所有行进行升序排序(> =某个日期,在这种情况下让我们使用 2018-07-15),并且之前的所有行都将进行降序排序。
试试这个与子查询的联合:
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
确切知道您要使用的日期,您可以这样做:
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 中指定了基于并集之前订购的每个项目的顺序。
@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 语句实现为 LEAST()
参考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
您可能并不真的需要上面显示的所有技术,但我只是在进行过程中编造这些东西...
您应该使用单个 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
好的,所以我有一个 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
,但我不知道如何使用它,或者它不接受每个 SELECT
中指定的 ORDER BY
子句。
编辑: 我可能没有很好地解释自己。在我的查询中,我需要它按日期对特定日期之后的所有行进行升序排序(> =某个日期,在这种情况下让我们使用 2018-07-15),并且之前的所有行都将进行降序排序。
试试这个与子查询的联合:
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
确切知道您要使用的日期,您可以这样做:
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 中指定了基于并集之前订购的每个项目的顺序。
@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 语句实现为 LEAST()
参考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
您可能并不真的需要上面显示的所有技术,但我只是在进行过程中编造这些东西...
您应该使用单个 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