Проблема с соединением запросов MySQL при использовании FIND_IN_SET и GROUP_CONCAT

Таким образом, у меня есть структура продуктов / категорий / брендов, где категории продуктов идентифицируются столбцом, содержащим список идентификаторов категорий, разделенных запятыми, т.е. 101,105,108, а также столбец идентификатора бренда.

Я пытаюсь получить список всех продуктов, заменить идентификаторы категорий на список названий категорий, разделенных запятыми, а также название бренда.

У меня есть следующий запрос, который работает:

SELECT 
    productid AS product_id,
    prodname AS name,
    prodcode AS code,
    proddesc AS description,
    prodprice AS price,
    GROUP_CONCAT(c.catname)
FROM
    products p,
    categories c
WHERE
    FIND_IN_SET(c.categoryid, p.prodcatids)
GROUP BY p.productid

Однако, когда я пытаюсь оставить соединение следующим образом, чтобы получить название бренда, он ломается и говорит, что столбец p.prodbrandid не существует (он существует).

SELECT 
    productid AS product_id,
    prodname AS name,
    prodcode AS code,
    proddesc AS description,
    prodprice AS price,
    b.brandname AS brand,
    GROUP_CONCAT(c.catname)
FROM
    products p,
    categories c
        LEFT JOIN
    brands b ON p.prodbrandid = b.brandid
WHERE
    FIND_IN_SET(c.categoryid, p.prodcatids)
GROUP BY p.productid

Любые указатели на то, что я скучаю, будет принята с благодарностью!

1 ответ

Решение

Из совета в комментариях:

SELECT 
    p.productid AS product_id,
    p.prodname AS name,
    p.prodcode AS code,
    p.proddesc AS description,
    p.prodprice AS price,
    b.brandname AS brand,
    GROUP_CONCAT(c.catname)
FROM
    products p
    INNER JOIN categories c on FIND_IN_SET(c.categoryid, p.prodcatids) > 0
    LEFT JOIN brands b ON p.prodbrandid = b.brandid        
GROUP BY p.productid

Однако не идеально хранить данные в виде разделенных запятыми списков; это действительно должно быть разбито на дополнительную таблицу, которая разбивает отношения "многие: многие" между продуктом и категорией (у нескольких продуктов может быть несколько категорий) на две 1: множество отношений (таблица "productcategories", которая имеет пару productid,categoryid)

Рассмотрим что-то вроде этого как одноразовую операцию:

CREATE TABLE ProductCategories(ProductId INT, CategoryId INT)

INSERT INTO ProductCategories
  SELECT 
  p.productid, c.categoryid
FROM
  products p
  INNER JOIN categories c on FIND_IN_SET(c.categoryid, p.prodcatids) > 0

Затем используйте его вперед и опустите столбец категорий

Другие вопросы по тегам