Проблема с соединением запросов MySQL при использовании FIND_IN_SET и GROUP_CONCAT - PullRequest
0 голосов
/ 14 января 2019

Таким образом, у меня есть структура продуктов / категорий / брендов, в которой категории продуктов определяются столбцом, содержащим список идентификаторов категорий, разделенных запятыми, то есть 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 Ответ

0 голосов
/ 15 января 2019

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

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

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

...