MySQL сортирует после аргумента в IN ()

У меня есть строка, содержащая множество идентификаторов, соответствующих моей базе данных. Подобно:

1,2,3,4,5 

Затем я делаю запрос mySQL для выбора всех этих строк:

 SELECT * FROM `table` WHERE `id` IN (".$myIDs.") 

Я хочу, чтобы mySQL возвращал строки в том порядке, в котором они находятся в моем выборе IN ().

Поэтому, если бы я вместо этого

 2,1,3,4,5 

У меня было бы # 2 как первая строка, когда выбрали в PHP. Без ORDER BY это похоже на то, что сначала возвращает самый низкий идентификатор.

Дайте мне знать, если вам потребуется дополнительная экспансия.

Solutions Collecting From Web of "MySQL сортирует после аргумента в IN ()"

Вы должны сделать это с помощью функции FIELD() :

 SELECT * FROM `table` WHERE `id` IN (2,1,3,4,5) ORDER BY FIELD(`id`, 2,1,3,4,5) DESC 

То есть:

 SELECT * FROM `table` WHERE `id` IN (".$myIDs.") ORDER BY FIELD(`id`, ".$myIDs.") DESC 

Подробнее в этом сообщении в блоге: Сортировка строк MySQL с использованием значений столбцов .

Вы можете использовать order by помощью case ... end , хотя часть между case и end должна быть сгенерирована PHP:

 select * from table where id in (2, 1, 3, 4, 5) order by case id when 2 then 1 when 1 then 2 when 3 then 3 when 4 then 4 when 5 then 5 end asc 

вам нужна функция find_in_set

 $list = "1,2,...."; $sql = "select * from table where id in($list) order by find_in_set($id, '$list')"; 

другой (возможно, более быстрый) вариант – сделать сортировку в php:

 $list = array(2, 3, ...); $s = implode(',', $list); $sth = mysql_query("select * from table where id in($s)"); $rows = array(); while($r = mysql_fetch_object($sth)) $rows[$r->id] = $r; $sorted_rows = array(); foreach($list as $id) $sorted_rows[] = $rows[$id]; 

Другой вариант, хотя FIELD – это, вероятно, способ пойти в вашем случае:

 SELECT * FROM `table` WHERE `id` IN (2,1,3,4,5) ORDER BY `id` = 2 DESC, `id` = 1 DESC,`id` = 3 DESC, `id` = 4 DESC, `id` = 5 DESC