Как исправить ORDER BY с идентификаторами предметов? - PullRequest
0 голосов
/ 12 июня 2019

У меня есть таблица, содержащая идентификатор элемента, вот несколько примеров:

1
1:3
2:1
2:2
3
3:1
12:2
21:2

Я хочу, чтобы они были отсортированы в указанном порядке ^ MYSQL сортирует их в следующем порядке:

1
1:3
12:2
2:1
2:2
21:2
3
3:1

Кто-нибудь знает, как решить эту проблему?

Ответы [ 3 ]

0 голосов
/ 12 июня 2019

Вы можете использовать ABS() или CAST(), если вас это устраивает следующим образом:

SELECT * FROM table ORDER BY ABS(column);
SELECT * FROM table ORDER BY CAST(column as DECIMAL);
0 голосов
/ 12 июня 2019
SELECT _table.*
#      , RPAD(SUBSTRING_INDEX(_table._col, ':', 1), 3, 0)
FROM
    (
     SELECT
         CAST('1' AS CHAR) AS _col
     UNION
     SELECT
         '1:3'
     UNION
     SELECT
         '2:1'
     UNION
     SELECT
         '2:2'
     UNION
     SELECT
         '3'
     UNION
     SELECT
         '3:1'
     UNION
     SELECT
         '12:2'
     UNION
     SELECT
         '21:2') _table
ORDER BY RPAD(SUBSTRING_INDEX(_table._col, ':', 1), 3, 0),
    RPAD(SUBSTRING_INDEX(_table._col, ':', 2), 5, 0)
;
0 голосов
/ 12 июня 2019

Используя SUBSTRING_INDEX() возможно:

SELECT *
FROM TestTable
ORDER BY CAST(SUBSTRING_INDEX(ColumnVal, ':', 1) AS UNSIGNED),
         CAST(SUBSTRING_INDEX(ColumnVal, ':', 2) AS UNSIGNED)

Демонстрация на дб <> скрипка

По-другому, используя POSITION()

SELECT *
FROM TestTable
ORDER BY CAST(SUBSTRING_INDEX(ColumnVal, ':', 2) AS UNSIGNED),
         POSITION(":" IN ColumnVal),
         SUBSTRING(ColumnVal, POSITION(":" IN ColumnVal) + 1, LENGTH(ColumnVal))

Демонстрация на дб <> скрипка

...