MySQL: IN() и сортировка

Ashotovich

Новичок
MySQL: IN() и сортировка

Всем привет!

Столкнулся с такой проблемой:
Если запрос имеет вид SELECT * FROM tablename WHERE some_id IN (4, 1, 2, 5, 3), то MySQL выдает данные, в том порядке, в каком они лежат в таблице, а не в том, в каком они перечислены в IN(). Вопрос: есть ли возможность сохранить порядок строк такой же, как и в IN()? Простая замена на конструкцию (some_id=4 OR some_id=1 OR some_id=2...) также не приводит к желаемому результату.
Заранее спасибо за помощь.

С уважением, Ashotovich
 

camka

не самка
Код:
select case some_id 
when 4 then 1
when 1 then 2
when 5 then 3
when 3 then 4
end  as sort_order

from tablename where some_id in (4,1,2,5,3)
order by sort_order
а лучше сделать поле sort_order в таблице, если используется чаще, чем только в одном запросе.
 

Ashotovich

Новичок
Бресь Сергей,

О, в точку. Спасибо!

camka,

Это сработало бы, если бы был известен нужный порядок. Но он, к сожалению, неизвестен - данные в IN() также выбираются из базы.
 

camka

не самка
Автор оригинала: Ashotovich

camka,

Это сработало бы, если бы был известен нужный порядок. Но он, к сожалению, неизвестен - данные в IN() также выбираются из базы.
подзапросом чтоли? все равно не понимаю, если уж ты имеешь возможность склеить как-то второй параметр для FIND_IN_SET почему ты таким же образом не можешь сгенерировать набор case условий? или ты используешь GROUP_CONCAT?

и все равно у меня FIND_IN_SET сортировка не работает
[sql]
select site
from stat_dirs
where site in (37, 14, 4, 3 )
order by find_in_set(site, '37, 14, 4, 3')
limit 1000
[/sql]

в результате присутствуют строки
Код:
   4  
   4  
  14  
   3  
   3  
   3  
   4
 

Demiurg

Guest
Ashotovich
может ты будешь объяснять задачу полностью, что бы самые важные факты не всплывали после того, как тебе ответили ?
 

Сергей123

Новичок
Ashotovich
единственное - если будет '37,14,4,3,4,3', то выберется не так. Но у тебя ведь some_id уникальный?
 

Ashotovich

Новичок
Demiurg,

Ок, учту. Следовало написать "порядок цифр внутри IN() и их необходимое расположение заранее неизвестны".

Да, насчет пробелов - это точно. :)

-~{}~ 06.07.04 12:10:

Бресь Сергей,

Уникальный, конечно. :)
 

Demiurg

Guest
Ashotovich
>данные в IN() также выбираются из базы.
вот про это поподробнее.
 

Ashotovich

Новичок
Demiurg,

Там просто функция была (не мной писанная), которая на основе иерархического списка (по parent_id) составляла одномерный массив, состоящий из some_id. Потом массив склеивался implode и вставлялся в IN() при последующей обработке (вытягивания из базы остальных данных, соответствующих каждому some_id). В общем, жуть.

Но у меня в итоге (после тутошнего обсуждения) дошли руки поправить эту кривизну (и ведь надо-то было минут пятнадцать уделить... так орамши и уснул) - просто строю список, захватывая все данные внутри самой функции построения списка, без всяких массивов и IN(), а с прямым выводом на экран. Так что вопрос из области практики переместился в область теории. ;)
 
Сверху