SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 23.04.2017 09:25:22

keysi_
Участник
Зарегистрирован: 18.05.2010
Сообщений: 16

Сортировка по условию

Требуется сделать сортировку по условию в один запрос.
Вопрос кажется простым, но то ли я не могу сообразить, то ли он не простой.

Есть таблица:

id(int) status(bul) date
1         0              18-02-2017
2         1              21-02-2017
3         0              19-02-2017
4         0              20-02-2017
5         1              17-02-2017
6         0              22-02-2017
7         1              16-02-2017


Надо отсортировать результат таким образом, чтобы сначала шли записи со status=1, а потом со status=0. НО! записи со status=1 должны быть отсортированы по date ASC, а записи со status=0 по date DESC. То есть чтобы получилось так:

7         1              16-02-2017
5         1              17-02-2017
2         1              21-02-2017
6         0              22-02-2017
4         0              20-02-2017
3         0              19-02-2017
1         0              18-02-2017

Неактивен

 

#2 23.04.2017 10:03:15

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Сортировка по условию

mysql> select * from test;
+------+--------+------------+
| id   | status | date       |
+------+--------+------------+
|    1 |      0 | 2017-02-18 |
|    2 |      1 | 2017-02-21 |
|    3 |      0 | 2017-02-19 |
|    4 |      0 | 2017-02-20 |
|    5 |      1 | 2017-02-17 |
|    6 |      0 | 2017-02-22 |
|    7 |      1 | 2017-02-16 |
+------+--------+------------+
7 rows in set (0.01 sec)

mysql> select * from test order by `status` desc, cast(if(`status`=1,`date`,-`date`) as SIGNED);
+------+--------+------------+
| id   | status | date       |
+------+--------+------------+
|    2 |      1 | 2017-02-21 |
|    5 |      1 | 2017-02-17 |
|    7 |      1 | 2017-02-16 |
|    6 |      0 | 2017-02-22 |
|    4 |      0 | 2017-02-20 |
|    3 |      0 | 2017-02-19 |
|    1 |      0 | 2017-02-18 |
+------+--------+------------+
7 rows in set, 3 warnings (0.00 sec)
 

Неактивен

 

#3 23.04.2017 10:11:19

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Сортировка по условию

не неправильно, тогда только городить через пользовательские переменные, нумеруя отдельно
select * from test where status=1 order by date
и
select * from test where status=0 order by date desc
и потом через union all с сортировкой status desc, `внутренняя нумерация через переменные`

в общем проще сделать 2 запроса к базе и сложить результат на клиенте

Неактивен

 

#4 23.04.2017 10:16:40

keysi_
Участник
Зарегистрирован: 18.05.2010
Сообщений: 16

Re: Сортировка по условию

Значит всё таки сложно sad .

Я пробовал так:

SELECT * FROM `test` ORDER BY `status`=1 DESC, CASE WHEN `status`=1 THEN '`date` ASC' ELSE '`date` DESC' END

но вторая, почему то (кстати почему, не подскажете?) сортировка вообще не срабатывает. тоже самое с IF'ом.

Отредактированно keysi_ (23.04.2017 10:18:10)

Неактивен

 

#5 23.04.2017 10:19:09

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Сортировка по условию

хотя можно так:

mysql> select * from test order by `status` desc, cast(if(`status`=1,date_format(`date`,'%Y%m%d'),-date_format(`date`,'%Y%m%d')) as signed);
+------+--------+------------+
| id   | status | date       |
+------+--------+------------+
|    7 |      1 | 2017-02-16 |
|    5 |      1 | 2017-02-17 |
|    2 |      1 | 2017-02-21 |
|    6 |      0 | 2017-02-22 |
|    4 |      0 | 2017-02-20 |
|    3 |      0 | 2017-02-19 |
|    1 |      0 | 2017-02-18 |
+------+--------+------------+
7 rows in set (0.00 sec)

Неактивен

 

#6 23.04.2017 10:48:18

keysi_
Участник
Зарегистрирован: 18.05.2010
Сообщений: 16

Re: Сортировка по условию

Так получилось. Спасибо большое.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson