#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 . Приведенный выше единственный простой способ сделать это, который приходит на ум, учитывая, что мы не обязательно знаем, сколько цифр может иметь размер или какие буквы могут следовать за числовым размером.