MySQL заказ по вопросу - PullRequest
       12

MySQL заказ по вопросу

4 голосов
/ 05 января 2010

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

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

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

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

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

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

Ответы [ 5 ]

10 голосов
/ 05 января 2010

Вы можете заказать по значению, полученному из столбца. Вы можете использовать оператор 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
2 голосов
/ 05 января 2010

Я не тестировал, но это решение 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 голос
/ 23 июля 2015
SELECT * FROM table WHERE id IN (3,6,1,8,9) ORDER BY FIELD(id,3,6,1,8,9);
1 голос
/ 05 января 2010

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

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

0 голосов
/ 05 января 2010

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

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

, а затем просто выполнить итерацию в вашем порядке

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