если у меня есть запрос вроде:
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]; ... }