Не работает сортировка по двум полям

212
03 мая 2017, 09:21

Есть простая таблица с 4 полями: id(int), text(text), parent_id(int), date_x(timestamp) Отсортировать надо что бы было так:

id date
--- ----------------
1   2017-04-29 18:01:03
2   2016-03-28 18:01:03
3   2015-04-27 18:01:03 

Что бы было понятно в таблице хранятся статьи/сообщения эти статьи можно комментировать, так вот свежая статья должна находится в верху списка, а свежий комментарий наоборот внизу Вот этот запрос не работает:

SELECT id, articles.text, parent_id, articles.date FROM articles ORDER BY articles.date, id DESC 

Пытался еще объединить 2 запроса с помощью UNION к примеру если parent_id > 0(комментарий) то DESC и если parent = 0(статья) то ASC, но тоже безрезультатно

Answer 1

можно сортировать по дополнительному вычислимому столбцу.

для вашего случая подойдёт, например, числовое представление даты и времени, возвращаемое функцией unix_timestamp(). и условие добавить — если значение такого-то столбца равно нулю, то возвращать отрицательное значение.

пример (дополнительный столбец — d2):

SQL Fiddle

MySQL 5.6 Schema Setup:

create table t (p int, d date);
insert into t (p, d) values
    (0, '2017-04-10')
  , (0, '2017-04-20')
  , (1, '2017-04-15')
  , (2, '2017-04-16')
;

Query 1:

select p, d, if(p=0, -unix_timestamp(d), unix_timestamp(d)) d2 from t
  order by d2

Results:

| p |                       d |          d2 |
|---|-------------------------|-------------|
| 0 | April, 20 2017 00:00:00 | -1492646400 |
| 0 | April, 10 2017 00:00:00 | -1491782400 |
| 1 | April, 15 2017 00:00:00 |  1492214400 |
| 2 | April, 16 2017 00:00:00 |  1492300800 |

в принципе, можно обойтись даже и без столбца, указав нужное условие прямо в order by:

SQL Fiddle

MySQL 5.6 Schema Setup:

create table t (p int, d date);
insert into t (p, d) values
    (0, '2017-04-10')
  , (0, '2017-04-20')
  , (1, '2017-04-15')
  , (2, '2017-04-16')
;

Query 1:

select * from t
  order by if(p=0, -unix_timestamp(d), unix_timestamp(d))

Results:

| p |                       d |
|---|-------------------------|
| 0 | April, 20 2017 00:00:00 |
| 0 | April, 10 2017 00:00:00 |
| 1 | April, 15 2017 00:00:00 |
| 2 | April, 16 2017 00:00:00 |
READ ALSO
Как загружать файлы многопоточно?

Как загружать файлы многопоточно?

У меня есть определенное количество файлов, которые нужно загрузить на устройствоВсе что нужно для загрузки из сети есть (Имею адрес файла)

288
Поиск ближайшего времени из списка

Поиск ближайшего времени из списка

Добрый деньУ меня есть строка, в ней расположено время ("10:00; 10:20, 09:40, и т

258
Too many open files on tomcat server, tomcat 9

Too many open files on tomcat server, tomcat 9

Томкат работает с огромным количеством файловОн открывает файл, берет всё его содержимое и записывает в String следующим образом:

293