Итак, у меня есть таблица как-то так
+----+-------+------------+
| 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) и все строки до сортировки по убыванию.
Вы должны сделать это с одним 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 как LEAST ()
Точно зная даты, которые вы хотите использовать, вы можете сделать это так:
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, основанный на каждом предмете, заказанном до объединения.