Смешайте восходящую и нисходящую сортировку в условной сортировке в MySQL - PullRequest
1 голос
/ 13 октября 2009

У меня есть одна таблица для двух разных видов новостей. Я хочу создать их список, упорядоченный по дате, которая зависит от типа новостей, поэтому я попробовал это:

SELECT * FROM my_table
ORDER BY case type
              when 'news' then creation_date 
              else 'events' then starting_date
         end desc;

Я хочу отсортировать новости по creation_date ASC и события по starting_date DESC. Я пытался просто добавить

when 'news' then creation_date ASC
else 'events' then starting_date DESC

но это не работает. Возможно ли это сделать?

Спасибо.

Ответы [ 6 ]

2 голосов
/ 13 октября 2009

Я думаю, вам нужно выполнить два отдельных запроса, каждый из которых отсортирован по-своему. Для сортировки необходимо уметь сравнивать любой элемент с любым другим и решать, что будет первым. Он не может сравнить элемент «новости» с элементом «событие» и получить значимый результат.

1 голос
/ 13 октября 2009

Я нашел решение:

SELECT 
    UNIX_TIMESTAMP(creation_date) AS order_column,
    creation_date,
    type,
    other_columns
FROM my_table 
WHERE type='news'
UNION ALL
SELECT 
    -UNIX_TIMESTAMP(starting_date) AS order_column,
    starting_date, 
    type,
    other_columns
FROM my_table 
WHERE type='events' 
ORDER BY order_column

Важным является минус перед второй функцией UNIX_TIMESTAMP. Результатом будет сортировка событий по убыванию, а затем сортировка всех новостей по возрастанию. Я надеюсь, что это то, что вы хотели.

0 голосов
/ 23 марта 2018
order by type,
    case when type = 'news'  then creation_date end desc,
    case when type = 'event' then starting_date end asc
0 голосов
/ 23 марта 2018
select ...  
    row_number() over (order by
        case when type = 'news'  then creation_date end asc,
        case when type = 'event' then starting_date end desc) as rn
...
order by rn, type desc,
    case when type = 'news' then creation_date else starting_date end asc
0 голосов
/ 13 октября 2009
select m.*, 
       case type
          when 'news' then 
             creation_date 
       end as sort_date_1,
       case type
          when 'events' then 
             starting_date
       end as sort_date_2
from my_table m
order by type desc, sort_date_1 asc nulls last, sort_date_2 desc nulls last
0 голосов
/ 13 октября 2009

будет ли что-то подобное работать?

select m.*, 
       case type
          when 'news' then 
             creation_date 
          when 'events' then 
             starting_date
       end as sort_date
from my_table m
order by sort_date desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...