У меня есть строка, содержащая множество идентификаторов, соответствующих моей базе данных. Подобно:
1,2,3,4,5
Затем я делаю запрос mySQL для выбора всех этих строк:
SELECT * FROM `table` WHERE `id` IN (".$myIDs.")
Я хочу, чтобы mySQL возвращал строки в том порядке, в котором они находятся в моем выборе IN ().
Поэтому, если бы я вместо этого
2,1,3,4,5
У меня было бы # 2 как первая строка, когда выбрали в PHP. Без ORDER BY это похоже на то, что сначала возвращает самый низкий идентификатор.
Дайте мне знать, если вам потребуется дополнительная экспансия.
Вы должны сделать это с помощью функции 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