PHP MySQL - порядок буквенных и цифровых строк

0

У меня есть следующие данные:

GROUP 1 - FINANCE
GROUP 10 - SALES
GROUP 11 - MARKETING
GROUP 12 - HR
GROUP 2 - OPS

Когда ORDERING данных в MySQL задает вопрос, он, верно, возвращает эти данные в указанном выше порядке. Тем не менее, есть ли вообще (без изменения данных, которые вы можете заказать в Numeric порядке?

GROUP 1 - FINANCE
GROUP 2 - OPS
GROUP 10 - SALES
GROUP 11 - MARKETING
GROUP 12 - HR

Спасибо!

  • 0
    Если бы этот столбец был числовым в базе данных, он сделал бы это автоматически. Можете ли вы изменить схему? В противном случае сработает простое приведение к int перед упорядочением. ps Я почти уверен, что на этот вопрос уже много раз отвечали здесь, и простой гугл также рассортировал бы его.
  • 0
    Вот статья, которая может быть полезной. copterlabs.com/natural-sorting-in-mysql, как упомянул @webnoob, вам лучше изменить схему, но если это невозможно, вам будет гораздо проще реализовать сортировку в php IMO (что вполне приемлемо, если набор данных небольшой).
Показать ещё 1 комментарий
Теги:
sorting
numeric

2 ответа

1
Лучший ответ

Добавление ORDER BY CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(column, ' ', 2), ' ', -1) AS UNSIGNED) должно помочь.

SUBSTRING_INDEX функции SUBSTRING_INDEX с правильными параметрами позволяют разбивать и извлекать строки. в этом случае числовая часть после первой части строки в этом случае будет извлечена "GROUP".

запрос

SELECT
 records.data
FROM (

SELECT 
 "GROUP 1 - FINANCE" AS data
UNION 
SELECT 
 "GROUP 10 - SALES" AS data
UNION 
SELECT 
 "GROUP 11 - MARKETING" AS data 
UNION 
SELECT 
 "GROUP 12 - HR" AS data  
UNION 
SELECT 
 "GROUP 2 - OPS" AS data   
) AS records
ORDER BY 
 CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(records.data, ' ', 2), ' ', -1) AS UNSIGNED)

см. демо https://www.db-fiddle.com/f/sGqUeTKaDjihRA3Bg3Myca/0

0

Начиная с MySQL 8.0, вы можете использовать REPLACE и REGEXP_SUBSTR для ORDER BY в столбце:

SELECT * 
FROM table_name
ORDER BY CAST(TRIM(REPLACE(REGEXP_SUBSTR(column_name, '(GROUP )([0-9]+)'), 'GROUP', '')) AS UNSIGNED)
  • 0
    MySQL не понимает INT как тип CAST (вы получаете ошибку разбора), вместо этого вам нужно использовать UNSIGNED . см. демонстрацию db-fiddle.com/f/jkzdNKhdeTJbsko4GbkNAg/0

Ещё вопросы

Сообщество Overcoder
Наверх
Меню