Подтвердить что ты не робот

MySQL Выберите ГДЕ В данном порядке

У меня есть что-то вроде

SELECT * FROM table WHERE id IN (118,17,113,23,72);

Если я просто сделаю это, он вернет строки в порядке возрастания ID. Есть ли способ вернуть строки в порядке, указанном в инструкции IN?

4b9b3361

Ответ 1

Вы должны использовать "ORDER BY FIELD". Так, например:

SELECT * FROM table WHERE id IN (118,17,113,23,72) 
ORDER BY FIELD(id,118,17,113,23,72)

Ответ 2

Попробуйте использовать 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');

Ответ 3

Вы можете создать временную таблицу с двумя столбцами (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() (о котором я не знал), вероятно, того, что вы хотите.

Ответ 4

Один из вариантов - использовать UNION:

SELECT * FROM table WHERE id = 118
UNION
SELECT * FROM table WHERE id = 17
UNION
SELECT * FROM table WHERE id = 113
...

Ответ 5

Вы можете создать число для сортировки на основе значений 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

Ответ 6

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

его немного громоздко, но может сделать трюк

select * from table where id = 118
union 
select * from table where id = 17
union 
.... and so on

Ответ 7

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

SELECT * FROM table WHERE id=118
UNION
SELECT * FROM table WHERE id=17
...

Уродливо, но я думаю, что это сработает.