MySQL пользовательская сортировка - PullRequest
18 голосов
/ 01 февраля 2010

У меня такой запрос: SELECT * FROM table WHERE id IN (2,4,1,5,3);

Однако, когда я распечатываю, он автоматически сортируется по 1,2,3,4,5 Как мы можем поддерживать порядок (2,4,1,5,3) без изменения структуры базы данных?

Спасибо!

Ответы [ 4 ]

56 голосов
/ 09 февраля 2012
SELECT * FROM table WHERE id IN (2,4,1,5,3) ORDER BY FIELD(id,2,4,1,5,3);

Источник: http://imthi.com/blog/programming/mysql-order-by-field-custom-field-sorting.php

20 голосов
/ 01 февраля 2010

я спрашиваю это:

mysql заказ по выпуску

ответы, которые я получаю, и все кредиты принадлежат им:

Вы можете использовать оператор 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;

?>
6 голосов
/ 23 января 2013

(я бы написал это как комментарий к ответу Мишеля Тобона, но не имею репутации, извините: -)

"И это сработало ... почему? Бьет меня, но оно просто сработало; попробуй тоже."

Причина, по которой это работает, заключается в том, что ваше выражение "code! = 'USA" "выдает логический результат, который в SQL представлен как 1 или 0. Таким образом, выражение" code =' USA "выдает 1 для каждая запись, которая соответствует этому критерию, и 0 для каждой записи, которая не соответствует. Поскольку 1 в сортировке по возрастанию (по умолчанию) позже 0, совпадающие записи будут сортироваться позже, чем несопоставимые. Таким образом, отрицательное выражение производит противоположный эффект.

Другой (возможно, более ясный) способ получения того же результата будет следующим:

SELECT * FROM countries ORDER BY code='USA' DESC, code='CAN' DESC, name ASC

Конечно, отвечая на вопрос ОП, мне больше всего нравится опция FIELD () - довольно чисто: -)

2 голосов
/ 12 июня 2012

Упорядочение по полю у меня никогда не работало. У меня был список стран, и мне нужно, чтобы Соединенные Штаты и Канада были в верхней части списка, поэтому мой запрос был таким:

SELECT * FROM countries ORDER BY code='USA', code='CAN', name ASC

Это никогда не работало, но я понял, что порядок был другим, он показывал Канаду и Штаты в конце списка, поэтому я сделал это:

SELECT * FROM countries ORDER BY code!='USA', code!='CAN', name ASC

И это сработало ... почему? Бьет меня, но это только что сделал; попробуй тоже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...