Сортировка / заказ в MySQL - PullRequest
2 голосов
/ 29 марта 2011

У меня небольшая проблема с попыткой отсортировать содержимое таблицы programs по столбцу prog_id, который содержит идентификатор каждой программы в следующем формате:

prog_id

1.0.1, 1.0.2, 1.0.3, ..., 1.0.10, 1.0.11, ..., 1.1.0, 1.1.1 и т. Д.

Когда я сортирую по prog_idя получаю

1.0.1, 1.0.10, 1.0.11, 1.0.2, 1.0.3 ...

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

Какие уловки я мог бы использовать, чтобы мои данные отображались в «правильном» порядке?Кстати, я использую PHP и MySQL.

Ответы [ 3 ]

1 голос
/ 29 марта 2011

Вы можете разделить их на составные части, такие как:

SELECT REPLACE(SUBSTRING(SUBSTRING_INDEX(prog_id, '.', 1),
       LENGTH(SUBSTRING_INDEX(prog_id, '.', 1 -1)) + 1),
       '.', '') AS id1,
       REPLACE(SUBSTRING(SUBSTRING_INDEX(prog_id, '.', 2),
       LENGTH(SUBSTRING_INDEX(prog_id, '.', 2 -1)) + 1),
       '.', '') AS id2,
       REPLACE(SUBSTRING(SUBSTRING_INDEX(prog_id, '.', 3),
       LENGTH(SUBSTRING_INDEX(prog_id, '.', 3 -1)) + 1),
       '.', '') AS id3
FROM programs
ORDER BY CAST(id1 AS INT(4)), CAST(id2 AS INT(4)), CAST(id3 AS INT(4))

Лучшим способом было бы создать дополнительные поля, как говорит yoda2k, но если у вас нет такого доступа, вы могли бы использовать выше.

Вы можете заключить это в функцию вроде:

CREATE FUNCTION SPLIT_STR(
  x VARCHAR(255),
  delim VARCHAR(12),
  pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
       LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
       delim, '');

Затем выполните:

SELECT SPLIT_STR(prog_id, '.', 1) AS id1,
   SPLIT_STR(prog_id, '.', 2) AS id2,
   SPLIT_STR(prog_id, '.', 3) AS id3,
FROM programs
ORDER BY CAST(id1 AS INT(4)), CAST(id2 AS INT(4)), CAST(id3 AS INT(4))
0 голосов
/ 29 марта 2011

Неоптимальное решение -

...ORDER BY substring_index(prog_id, '.', 1), substring_index(substring_index(prog_id, '.', 2), '.', -1), substring_index(prog_id, '.', -1)

Нечетное решение, но попробуйте -

...ORDER BY INET_ATON(prog_id)
0 голосов
/ 29 марта 2011

Вы можете использовать 3 поля, например, major_version, minor_version, build_number, сделать их целочисленными полями и использовать mysqls buildin «ORDER BY major_version, minor_version, build_number», который упорядочит поля желаемым образом.

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