Смешайте восходящую и нисходящую сортировку в условной сортировке в MySQL

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

SELECT * FROM my_table
ЗАКАЗАТЬ ПО типу корпуса
              когда «новости», то создание_дата 
              еще «события», тогда начальная_дата
         конец деск;

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

когда «новости», то создание_дата ASC
еще «события», тогда начальная_дата DESC

но это не работает Можно ли сделать это?

Спасибо.

13.10.2009 14:04:25
Это не имеет смысла для меня, вы можете добавить пример, как вы хотите, чтобы результат был отсортирован?
Lukáš Lalinský 13.10.2009 14:39:32
Новости всегда в прошлом, а события в будущем. Мы хотим отображать ближайшие новости и события. Используя первый SELECT, я получил самые дальние события сверху, а затем новости и события, смешанные к нужной дате. Но мне нужно сначала отобразить самое близкое к сегодняшнему дню событие. Затем новости должны быть упорядочены по дате создания DESC (ups, я говорил об этом наоборот), сначала должны появляться новости с более крупными датами, а события противоположным образом, сначала появляются меньшие даты. Так понятнее? Мне действительно было трудно понять, чего хочет мой босс.
Morthylla 13.10.2009 17:10:43
Вы можете использовать row_number()?
shawnt00 23.03.2018 06:42:09
6 ОТВЕТОВ

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

2
13.10.2009 14:48:46
+1 Существует множество «действительных» сортов, в которых дата создания новостных элементов возрастает, а события убывают в зависимости от их чередования. Вам нужно будет указать это более четко, в противном случае наиболее очевидным решением будет сортировка одного и объединение его с другим.
Stefan Mai 13.10.2009 15:10:58

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

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. Результатом будет сортировка событий по убыванию, а затем сортировка всех новостей по возрастанию. Я надеюсь, что это то, что вы хотели.

1
13.10.2009 15:04:53

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

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
0
13.10.2009 15:07:32
Он будет сортировать как по убыванию, так и по возрастанию, и по убыванию.
Lukasz Lysik 13.10.2009 15:10:07
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.10.2009 15:53:27
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
23.03.2018 06:48:12
order by type,
    case when type = 'news'  then creation_date end desc,
    case when type = 'event' then starting_date end asc
0
23.03.2018 06:55:55