mysql order by issue

если у меня есть запрос вроде:

SELECT * FROM table WHERE id IN (3,6,1,8,9); 

этот массив идентификаторов построен в php динамически, и порядок важен для меня.

 $my_array = array (3,6,1,8,9) ; 

как я могу отсортировать результаты по порядку, по которому элементы появляются в моем массиве?

его можно сделать в запросе MYSQL, или я должен заказать его после использования php?

Вы можете заказать значение, полученное из столбца. Вы можете использовать оператор CASE для указания порядка:

 SELECT * FROM table WHERE id IN (3,6,1,8,9) ORDER BY CASE id WHEN 3 THEN 1 WHEN 6 THEN 2 WHEN 1 THEN 3 WHEN 8 THEN 4 WHEN 9 THEN 5 END 

Я не тестировал, но это PHP-решение должно работать:

 <?php $my_array = array (3,6,1,8,9) ; $sql = 'SELECT * FROM table WHERE id IN (3,6,1,8,9)'; $sql .= "\nORDER BY CASE id\n"; foreach($my_array as $k => $v){ $sql .= 'WHEN ' . $v . ' THEN ' . $k . "\n"; } $sql .= 'END '; echo $sql; ?> 

Это генерирует следующий код SQL:

 SELECT * FROM table WHERE id IN (3,6,1,8,9) ORDER BY CASE id WHEN 3 THEN 0 WHEN 6 THEN 1 WHEN 1 THEN 2 WHEN 8 THEN 3 WHEN 9 THEN 4 END 

Если вы должны сделать это таким образом, вам придется манипулировать данными в PHP. MySQL может упорядочивать только по естественным упорядочениям по возрастанию или по убыванию.

Еще вопрос: зачем вам данные, возвращенные в этом конкретном порядке? Возможно, вам будет проще решить вашу проблему, повторно переделав что-то еще в коде.

 SELECT * FROM table WHERE id IN (3,6,1,8,9) ORDER BY FIELD(id,3,6,1,8,9); 

Вы можете загрузить результаты в массив с идентификаторами как индексы:

  while ($row = mysql_fetch_array($l)) $items[$row['id']] = $row; 

а затем просто повторите его в своем заказе

  foreach ($my_array as $id) { $current_row = $items[$id]; ... }