IF в ORDER BY

mike

pmcoder
IF в ORDER BY

Есть конструкция вида
PHP:
SELECT * 
  FROM table
ORDER BY IF( condition , field1 , field2 )
Т.е взависимости от условия, менять поле по которому осуществляется сортировка.
Данная конструкция работает отлично.

Интересует возможность менять направление.
Т.е. конструкция вида
PHP:
SELECT * 
  FROM table
ORDER BY field IF( condition , ASC , DESC )
Как вариант пробовал
PHP:
ORDER BY IF( condition ,  field ASC ,  field DESC )
При попытке запроса получаю ошибку синтаксиса.
Возможна ли такая конструкция?
 

LONGMAN

Dark Side of the Moon..
mike
Помню тоже пробовал однажды, даже долго гуглил но не вышло
 

Фанат

oncle terrible
Команда форума
mike
можно посмотреть пример таким образом отсортированного списка?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
пробуй так
select IF( condition , field1 , field2 ) AS sort_name
....................
Order BY sort_name
 

mike

pmcoder
Пример:
Есть таблица с рассылками, которые добавляют/редактируют пользователи.
Админ проверят рассылки и ставит отметку ( confirmed )
Кроме того сохраняется время последнего редактирования(добавления) рассылки. ( edit_time )

Мне нужно для админа отсортировать рассылки так:

ORDER BY confirmed ASC, edit_time IF( confirmed , DESC , ASC )

Сначала показываются непровереные рассылки от самой старой до самой новой, потом провереные от новой до старой.

-~{}~ 08.09.10 01:13:

Mr_Max
IF( condition , field1 , field2 ) работает и в ORDER BY
Не работает IF( condition , ASC , DESC )
 

iceman

говнокодер
mike
это можно и в пхп обработать, условие сортировки... динамический sql
 

iceman

говнокодер
все равно это будет всяко быстрее рапотать, чем всякие управляющие конструкции и операции в sql
 

zerkms

TDD infected
Команда форума
Не факт, что пхп будет сортировать быстрее mysql.
 

mike

pmcoder
Спасибо zerkms за рабочую подсказку.
Заработала конструкция
PHP:
ORDER BY confirmed ASC, IF( confirmed , - UNIX_TIMESTAMP(edit_time) , UNIX_TIMESTAMP(edit_time) ) ASC
Без преобразования в юникс_время не работает.

Но все таки интересно, если mysql все таки может сортировать в разные стороны в пределах запроса, то почему не срабатывает
ORDER BY field IF( condition , ASC , DESC ). Ведь возможно может быть случай сортировки, например, по текстовому полю и там минус не сработает.
 

Фанат

oncle terrible
Команда форума
потому что иф работает с ДАННЫМИ, а не с кодом.
а полей ASC и DESC в базе нет.

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

Rin

*
Expression в ORDER BY не позволит использовать ключи, я бы сделал через два SELECT'а и UNION, работать будет быстрее.
 

axe

Новичок
для динамической сортировки в прямом или обратном порядке:
Код:
  ORDER BY
  if(field_name='email desc', user_email,
  IF(field_name='company desc', user_company,
  null
  )) DESC,
  if(field_name='email asc', user_email,
  IF(field_name='company asc', user_company,
  null
  )) ASC;
 
Сверху