MySQL: условный порядок только на один столбец

dba.stackexchange https://dba.stackexchange.com/questions/5422

  •  16-10-2019
  •  | 
  •  

Вопрос

Здравствуйте и спасибо, что нашли время, чтобы прочитать этот вопрос.

Я использую 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 столбец должен быть динамичным. Я просто упоминаю об этом как вариант.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top