SQL Объединяет 3 таблицы и объединяет значения

#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