2010-01-05 2 views
4

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

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

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

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

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

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

ответ

10

Вы можете заказать значением, полученным из колонки. Вы можете использовать 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 
+0

Это ответ, о котором я думал - у меня был краевой случай много лет назад, который нуждался именно в этом решении. – leepowers

1

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

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

0

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

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

, а затем просто перебирать его в порядке

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

Я не проверял, но это 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 
1
SELECT * FROM table WHERE id IN (3,6,1,8,9) ORDER BY FIELD(id,3,6,1,8,9); 
Смежные вопросы