MySQL: условный порядок только на один столбец
Вопрос
Здравствуйте и спасибо, что нашли время, чтобы прочитать этот вопрос.
Я использую MySQL, и я хочу сортировать результаты, используя порядок по одному конкретному столбцу, но результаты должны быть упорядочены в соответствии с конкретными критериями этого столбца. Например, к следующей таблице я хочу ORDER BY 'group'
, показывая сначала 9,7,6 'group' items
и в конце концов 10,8,5 'group' items
:
names group
--------- ------
susanita 10
miguelito 5
mafalda 7
manolito 8
libertad 6
felipe 9
guille 8
заранее спасибо.
Решение
SELECT* FROM mytable ORDER BY
LOCATE(CONCAT('.',`group`,'.'),'.9.7.6.10.8.5.');
Я взял ваши образцы данных, загрузил их в таблицу под названием Mytable и запустил.
Вот результаты:
mysql> use test
Database changed
mysql> drop table if exists mytable;
Query OK, 0 rows affected (0.04 sec)
mysql> create table mytable
-> (
-> names varchar(10),
-> `group` int
-> );
Query OK, 0 rows affected (0.08 sec)
mysql> insert into mytable values
-> ('susanita', 10),
-> ('miguelito', 5),
-> ('mafalda', 7),
-> ('manolito', 8),
-> ('libertad', 6),
-> ('felipe', 9),
-> ('guille', 8);
Query OK, 7 rows affected (0.09 sec)
Records: 7 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM mytable;
+-----------+-------+
| names | group |
+-----------+-------+
| susanita | 10 |
| miguelito | 5 |
| mafalda | 7 |
| manolito | 8 |
| libertad | 6 |
| felipe | 9 |
| guille | 8 |
+-----------+-------+
7 rows in set (0.00 sec)
mysql> SELECT * FROM mytable ORDER BY
-> LOCATE(CONCAT('.',`group`,'.'),'.9.7.6.10.8.5.');
+-----------+-------+
| names | group |
+-----------+-------+
| felipe | 9 |
| mafalda | 7 |
| libertad | 6 |
| susanita | 10 |
| manolito | 8 |
| guille | 8 |
| miguelito | 5 |
+-----------+-------+
7 rows in set (0.01 sec)
mysql>
Попробуй !!!
Обновление 2011-09-06 12:33 EDT
Вот еще один подход:
SELECT* FROM mytable ORDER BY
IF(FIELD(`group`,9,7,6,10,8,5)=0,99999,FIELD(`group`,9,7,6,10,8,5));
Это заставит любые группы, отличные от 9,7,6,10,8,5, появится на самом дне запроса.
Обновление 2011-09-06 14:39 EDT
mysql> SELECT names, `group`
-> FROM mytable
-> WHERE `group` IN (9,7,6,10,8,5)
-> ORDER BY find_in_set(`group`,'9,7,6,10,8,5');
+-----------+-------+
| names | group |
+-----------+-------+
| felipe | 9 |
| mafalda | 7 |
| libertad | 6 |
| susanita | 10 |
| manolito | 8 |
| guille | 8 |
| miguelito | 5 |
+-----------+-------+
7 rows in set (0.00 sec)
Привет, @nick, ваш работает так же хорошо против моих образцов данных !!!
Другие советы
Используйте MySQL find_in_set()
функция для этого. Это более лаконично, но менее портативно, чем Кейс подход GBN предложено.
SELECT `names`, `group`
FROM my_table
WHERE `group` IN (9,7,6,10,8,5)
ORDER BY find_in_set(`group`,'9,7,6,10,8,5');
Потому что он опирается на поиск строк, find_in_set()
Полезно в основном для заказа на небольших наборах легко поиска клавиш, таких как целые числа.
Обычно (это спрашивается ежедневно в этом), вы бы использовали случай, который является стандартным SQL
ORDER BY
CASE group
WHEN 9 THEN 1
WHEN 7 THEN 2
WHEN 6 THEN 3
WHEN 10 THEN 4
WHEN 8 THEN 5
WHEN 5 THEN 6
ELSE 7
END
Мне было бы интересно посмотреть, как это сравнивается с большим набором данных с методом местоположения (concat ...) от Rolandomysqldba
Для более сложного примера см. Ошибка «преобразования» с ошибкой по заказу по выражению случая
Вы можете создать его как Перевозить тип.
Значения enum отсортированы в соответствии с порядком, в котором члены перечисления были перечислены в спецификации столбца. (Другими словами, значения enum сортируются в соответствии с их индексными числами.) Например, «сортировки перед« b »для enum (« a »,« b »), но« B »сортирует перед 'a' for enum ('b', 'a').
Так что создайте поле enum как ENUM('9','7','6','10','8','5')
Отказ от ответственности: я не поддерживаю это, потому что подозреваю, что твоя group
столбец должен быть динамичным. Я просто упоминаю об этом как вариант.