Проблема с соединением запросов 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
Затем используйте его вперед и опустите столбец категорий