#mysql #sql
#mysql #sql
Вопрос:
У меня есть 3 таблицы с отношением n: m
Языки:
- ИДЕНТИФИКАТОР (первичный ключ)
- Имя
- ошибка
Продукты:
- ID
- Имя
- slug -productgroup
Таблица для связи:
Lang_Prod:
- lang_prod_id (состоит из lang_id и prod_id)
- lang_id
- prod_id
Теперь я хочу получить все продукты с соответствующими языковыми названиями:
- продукт
- productgroup
- названия языков (несколько значений)
Я пытался:
SELECT product.*, languages_products.language_id,
GROUP_CONCAT(languages_products.language_id) as languages
FROM product
INNER JOIN languages_products ON id = languages_products.product_id
GROUP BY product.id;
Результат:
- productname
- product_slug
- product_group
- Строка с идентификаторами языков
Вместо строки с языковыми идентификаторами я хотел бы иметь строку с языковыми именами
Как я могу это архивировать?
Комментарии:
1. Эта ГРУППА ПО недопустима и должна вызвать ошибку. Обычно вы группируетесь по тем же столбцам, которые вы выбираете, за исключением тех, которые являются аргументами для установки функций.
2. это работает нормально, но это не то, что мне нужно
3. «работает нормально, но это не то, что мне нужно» — это противоречие.
4. @jarlh Нет, это не так. Он не вызывает никаких ошибок (работает нормально), но все еще не то, что мне нужно (не то, что мне нужно)
Ответ №1:
Вам нужно присоединиться к языковой таблице
SELECT product.id,product.name,product.productgroup,
GROUP_CONCAT(l.name) as languages
FROM product
INNER JOIN languages_products ON id = languages_products.product_id
INNER JOIN languages l ON languages_products.language_id=l.id
GROUP BY product.id,product.name,product.productgroup
Комментарии:
1. Вызовет ошибку в более новых версиях MySQL. (Если только не в режиме совместимости.)
Ответ №2:
Вам нужно добавить другое объединение с languages
таблицей и использовать name
столбец из нее. Я бы сгруппировал это во внутреннем запросе, хотя:
SELECT p.*, languages
FROM product p
JOIN (SELECT product_id, GROUP_CONCAT(l.name) as languages
FROM languages_products lp
JOIN languages l ON lp.language_id = l.id
GROUP BY product_id) cl ON cl.product_id = p.id