У меня есть такой запрос: SELECT * FROM table WHERE id IN (2,4,1,5,3);
Однако, когда я распечатываю его, он автоматически сортируется 1,2,3,4,5. Как мы можем поддерживать порядок (2,4,1,5,3) без изменения структуры базы данных?
Спасибо!
У меня есть такой запрос: SELECT * FROM table WHERE id IN (2,4,1,5,3);
Однако, когда я распечатываю его, он автоматически сортируется 1,2,3,4,5. Как мы можем поддерживать порядок (2,4,1,5,3) без изменения структуры базы данных?
Спасибо!
Я спрашиваю:
ответы, которые я получаю, и все они принадлежат им:
Вы можете использовать оператор 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 u может сделать это как:
<?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;
?>
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
(Я бы написал это как комментарий к Мишелю Тобону, но у меня нет репутации, извините: -)
"И это сработало... почему? Меня бьет, но это просто так, попробуйте."
Причина, по которой это происходит, заключается в том, что выражение "code!= 'USA" генерирует логический результат, который в SQL представляется как 1 или 0. Таким образом, выражение "code =' USA" создает 1 для каждая запись, соответствующая этому критерию, и 0 для каждой записи, которая этого не делает. Поскольку 1 более поздняя, чем 0 в восходящей сортировке (по умолчанию), сопоставление записей будет сортироваться позже, чем unmatching. Таким образом, отрицание этого выражения создает противоположный эффект.
Другой (возможно, более четкий) способ получения одного и того же результата будет следующим:
SELECT * FROM countries ORDER BY code='USA' DESC, code='CAN' DESC, name ASC
Конечно, отвечая на вопрос OP, мне больше нравится опция FIELD() - довольно чистая: -)
Поле "Заказ по полю" никогда не работало для меня. У меня был список стран, и мне нужно, чтобы США и Канада появлялись в верхней части списка, поэтому мой запрос был таким:
SELECT * FROM countries ORDER BY code='USA', code='CAN', name ASC
Это не сработало, но я понял, что порядок был другим, он показывал Канаду и Штаты в конце списка, поэтому я сделал это:
SELECT * FROM countries ORDER BY code!='USA', code!='CAN', name ASC
И это сработало... почему? Меня бьет, но это только что произошло; попробуйте также.