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, но либо я не знаю, как его использовать, либо он не принимает ORDER BY пункты, указанные в каждом SELECT,

РЕДАКТИРОВАТЬ: Я, вероятно, не объяснил себя так хорошо. В моем запросе мне нужно было бы отсортировать по возрастанию по дате все строки после определенной даты (> = некоторая дата, в данном случае давайте использовать 2018-07-15) и все строки до сортировки по убыванию.

1

Решение

Вы должны сделать это с одним 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

Другие решения

Со ссылкой на основу, заложенную 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

Возможно, вам не нужны все методы, показанные выше, но я просто придумываю все это, пока продвигаюсь вперед …

2

Попробуйте этот союз с подзапросом:

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
0

@ 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 ()

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, основанный на каждом предмете, заказанном до объединения.

0
По вопросам рекламы [email protected]