ЗАКАЗАТЬ по номерам MySQL в правильном порядке - PullRequest
1 голос
/ 11 октября 2011

У меня есть список данных из поля SQL. Я хочу отсортировать по полю ASC, но когда я это делаю, он появляется в неправильном порядке Я знаю, почему он это делает, но удивлялся, было ли решение этой проблемы. Я слышал о функции natsort php, но не исследовал ее. Есть ли простой способ?

Академия

До 10 синих

Под 10 зелеными

до 11 лет красный

Под 11 'Белый

до 13 лет синий

до 13 лет красный

Под 13 'Белый

до 14 лет синий

до 15 лет синий

до 15 лет красный

Под 15 'Белый

до 16 лет красный

моложе 18 лет

до 18 лет красный

до 7

Под 8 красных

Под 9 'Red

Ответы [ 5 ]

3 голосов
/ 11 октября 2011

Существует очень простой способ сортировки этого списка.Для всех значений Academy, начиная с Under, вы выполняете алгоритм сортировки на основе следующего предложения ORDER BY:

ORDER BY
REPLACE(Academy,'Under ','') + 0,Academy

Первый столбец сортировки основан на удалении строки «Под» и последующем добавлении0. Это приведет к упорядочению результирующего целого числа.

Вот пример вычисления числового значения путем удаления сначала «Under»:

mysql> select REPLACE('Under 15\'s Red','Under ','') + 0;
+--------------------------------------------+
| REPLACE('Under 15\'s Red','Under ','') + 0 |
+--------------------------------------------+
|                                         15 |
+--------------------------------------------+
1 row in set (0.00 sec)

Второй столбец сортировки будет упорядочен построковое значение Академии.Все 'Under 15's' сгруппированы и отсортированы по алфавиту и цифрам.

Вот ваши примеры данных из вопроса, загруженного в таблицу и отсортированного:

mysql> use test
Database changed
mysql> drop table if exists under99color;
Query OK, 0 rows affected (0.01 sec)

mysql> create table under99color
    -> (academy varchar(30),
    -> id int not null auto_increment,
    -> primary key (id),
    -> index academy (academy)) engine=MyISAM;
Query OK, 0 rows affected (0.04 sec)

mysql> show create table under99color\G
*************************** 1. row ***************************
       Table: under99color
Create Table: CREATE TABLE `under99color` (
  `academy` varchar(30) DEFAULT NULL,
  `id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`),
  KEY `academy` (`academy`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

mysql> insert into under99color (academy) values
    -> ('Under 10\'s Blue'),('Under 10\'s Green'),('Under 11\'s Red'),
    -> ('Under 11\'s White'),('Under 13\'s Blue'),('Under 13\'s Red'),
    -> ('Under 13\'s White'),('Under 14\'s Blue'),('Under 15\'s Blue'),
    -> ('Under 15\'s Red'),('Under 15\'s White'),('Under 16\'s Red'),
    -> ('Under 18\'s Blue'),('Under 18\'s Red'),('Under 7\'s'),
    -> ('Under 8\'s Red'),('Under 9\`s Red');
Query OK, 17 rows affected (0.00 sec)
Records: 17  Duplicates: 0  Warnings: 0

mysql> select academy from under99color
    -> ORDER BY REPLACE(Academy,'Under ','') + 0,Academy;
+------------------+
| academy          |
+------------------+
| Under 7's        |
| Under 8's Red    |
| Under 9`s Red    |
| Under 10's Blue  |
| Under 10's Green |
| Under 11's Red   |
| Under 11's White |
| Under 13's Blue  |
| Under 13's Red   |
| Under 13's White |
| Under 14's Blue  |
| Under 15's Blue  |
| Under 15's Red   |
| Under 15's White |
| Under 16's Red   |
| Under 18's Blue  |
| Under 18's Red   |
+------------------+
17 rows in set (0.00 sec)

mysql>

Попробуйте!

1 голос
/ 11 октября 2011

Вы можете добавить поле к запросу выбора, которое использует CAST , чтобы преобразовать его в число.Сначала вам нужно будет найти метод подстроки, который в первую очередь выберет число из строки (возможно, используйте функцию Field для пробела и ').После того как вы выделите его как целое число, сортировка в этой точке должна быть тривиальной.

Возможный пример (псевдокод - может не работать "из коробки"):

SELECT TeamType, CAST(SUBSTRING(TeamType, FIELD(' ', TeamType), FIELD('\'', TeamType) - Field(' ', TeamType)), UNSIGNED) As TeamAge
FROM Teams
ORDER BY TeamAge, TeamType
0 голосов
/ 11 октября 2011

отсортировано по алфавиту;вам нужно проанализировать поле вывода и отсортировать их по номеру позже.

0 голосов
/ 11 октября 2011

Ну, вы можете хранить номер и цвет отдельно (с возможностью пустого цвета), а затем упорядочить по номеру, а затем по цвету. Например:

SELECT CONCAT('Under ',ageIndex,'\'s ',colour) AS Team FROM Academy
ORDER BY ageIndex, colour

Возможное преимущество этого, в зависимости от ваших требований, заключается в том, что вы также можете запускать запросы по возрасту и цветам отдельно.

0 голосов
/ 11 октября 2011

Ваше поле является строкой!Таким образом он сортирует строковые значения.

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