У меня есть что-то вроде
SELECT * FROM table WHERE id IN (118,17,113,23,72);
Если я просто сделаю это, он вернет строки в порядке возрастания ID. Есть ли способ вернуть строки в порядке, указанном в инструкции IN?
У меня есть что-то вроде
SELECT * FROM table WHERE id IN (118,17,113,23,72);
Если я просто сделаю это, он вернет строки в порядке возрастания ID. Есть ли способ вернуть строки в порядке, указанном в инструкции IN?
Вы должны использовать "ORDER BY FIELD". Так, например:
SELECT * FROM table WHERE id IN (118,17,113,23,72)
ORDER BY FIELD(id,118,17,113,23,72)
Попробуйте использовать FIND_IN_SET
:
SELECT * FROM table WHERE id IN (118,17,113,23,72)
ORDER BY FIND_IN_SET(id, '118,17,113,23,72');
Вы можете создать временную таблицу с двумя столбцами (ID, order_num):
ID order_num
118 1
17 2
113 3
23 4
72 5
Затем присоединяем:
SELECT * from table
INNER JOIN #temp_table
ON table.id = #temp_table.id
Обратите внимание, что вы можете отказаться от предложения IN
.
Иногда я фактически создаю постоянную таблицу, потому что тогда, когда клиент неизбежно меняет свое мнение о заказе, мне не нужно прикасаться к коду, только к таблице.
Edit
Ответ с использованием ORDER BY FIELD() (о котором я не знал), вероятно, того, что вы хотите.
Один из вариантов - использовать UNION:
SELECT * FROM table WHERE id = 118
UNION
SELECT * FROM table WHERE id = 17
UNION
SELECT * FROM table WHERE id = 113
...
Вы можете создать число для сортировки на основе значений id:
select *
from table
where id in (118,17,113,23,72)
order by
case id
when 118 then 1
when 17 then 2
when 133 then 3
when 23 then 4
when 72 then 5
end
это первое, что приходит в голову. note sql не проверен, вам может потребоваться проверить правильный синтаксис
его немного громоздко, но может сделать трюк
select * from table where id = 118
union
select * from table where id = 17
union
.... and so on
Я думаю, что если вы делали запрос UNION
с каждым выбором, он мог бы вернуть его в порядке.
SELECT * FROM table WHERE id=118
UNION
SELECT * FROM table WHERE id=17
...
Уродливо, но я думаю, что это сработает.