Вопрос по mysql, sql – MySQL условный ORDER BY ASC / DESC для столбца даты

7

Мне нужно MySQL условного оператора ORDER BY для поля datetime. У меня есть таблица с сообщениями, которые я хотел бы заказать следующим образом: всеfuture posts должен быть заказанASC и всеhistorical posts приказалDESC, Например.:

post_status     post_date     post_title
===========     =========     ==========
future          2012-10-01    Title 1
future          2012-12-01    Title 2
publish         2012-05-01    Title 3
publish         2012-01-01    Title 4

Мне нужно что-то похожее на следующий SQL ...

SELECT post_status, post_date, post_title FROM wp_posts
WHERE post_status IN ('future', 'publish')
ORDER BY post_status ASC,
 CASE post_status 
  WHEN 'future' THEN 'post_date ASC'
  ELSE 'post_date DESC'
 END;

Любые советы о том, как это сделать? Спасибо!

Ваш Ответ

4   ответа
1

Попробуй это -

SELECT
  post_status, post_date, post_title
FROM
  wp_posts
WHERE
  post_status IN ('future', 'publish')
ORDER BY
  IF(post_status = 'future', 0, 1),
  IF(post_status = 'future', TO_DAYS(post_date), TO_DAYS(post_date) * -1);
Большой! Кажется, это работает, хотя я действительно не следую тому, что я делаю ... Mike
16

Попробуй это:

ORDER BY post_status ASC,
CASE post_status WHEN 'future' THEN POST_DATE END ASC,
CASE WHEN post_status <> 'future' THEN post_date END DESC
Это лучшее решение, потому что требуется только одно сканирование таблицы.
Большой! Также, кажется, делает трюк! Спасибо! Mike
1

Как насчет этого? Выберите дважды и объедините результаты.

Select * from (SELECT post_status, post_date, post_title 
FROM wp_posts WHERE post_status IN ('future') 
ORDER BY post_status ASC  ) alias1  
UNION
Select * from (SELECT post_status, post_date, post_title 
FROM wp_posts WHERE post_status IN ('publish') 
ORDER BY post_status DESC ) alias2  
Error: User Rate Limit Exceeded Mike
0

я бы использовалunion allприколыorder by не может использовать индекс и работает медленнее.

SELECT * FROM
((SELECT
  1 AS a, @rownum:[email protected]+1 B, post_status, post_date, post_title
FROM
  wp_posts, (SELECT @rownum:=0) r 
WHERE
  post_status='publish'
ORDER BY
  post_date DESC)
UNION ALL
(SELECT
  2 AS a,  @rownum:[email protected]+1 B, post_status, post_date, post_title
FROM
  wp_posts, (SELECT @rownum:=0) r2
WHERE
  post_status='future'
ORDER BY
  post_date)) ORDER BY A,B;
Error: User Rate Limit Exceeded Mike

Похожие вопросы