Идентификаторы не выводятся по порядку, после использования group_concat

#mysql #sql #string #csv

#mysql #sql #строка #csv

Вопрос:

у меня возникли проблемы с сопоставлением идентификаторов таблицы size_categories с таблицей размеров. Это запрос

 select
    size_categories.size_id,
    GROUP_CONCAT(sizes.name) as size_name
from `subcategories`
inner join `categories` on `categories`.`id` = `subcategories`.`categories_id`
inner join `size_categories` on `size_categories`.`categories_id` = `categories`.`id`
inner join `sizes` on FIND_IN_SET(sizes.id, size_categories.size_id) > '0'
where
    `subcategories`.`id` = '15'
group by
    `subcategories`.`name`,
    `size_categories`.`size_id`
  

Результат

 size_id    size_name

4,2,1       2m,8m,4m
  

Проблема в том, что 4 на самом деле является идентификатором 4m, а 1 — 2m. Как я могу привести это в порядок?
Пожалуйста, помогите. Спасибо

Комментарии:

1. Почему вы не нормализуете size_id ? И, пожалуйста, прекратите цитировать цифры, такие как '0'

2. да, я должен. но это становится сложным и забавным.

3. Менее сложный и забавный, чем ваше текущее решение.

Ответ №1:

Вы можете order by в group_concat() . Я думаю, вы хотите:

 group_concat(
    sizes.name 
    order by find_in_set(sizes.id, size_categories.size_id)
) as size_name
  

Ответ №2:

Попробуйте упорядочить по старшим цифрам размеров:

 select
    size_categories.size_id,
    GROUP_CONCAT(
        sizes.name
        ORDER BY CAST(REGEXP_SUBSTR(sizes.name, '^[0-9] ') AS UNSIGNED)
    ) as size_name
  

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