MySQL объединяет продукты с деревом категорий, даже если категории являются нулевыми - PullRequest
1 голос
/ 11 октября 2019

Я хочу экспортировать все продукты из базы данных Open Cart с их родительскими категориями. Мои таблицы:

oc_product_description (идентификатор продукта, имя, язык ....)

oc_product (идентификатор продукта, модель, цена, статус ...)

oc_product_to_category (идентификатор продукта, идентификатор категории)

oc_category (идентификатор категории, статус ....)

oc_category_description (идентификатор категории, имя, идентификатор языка ...)

Вот мой код:

select pd.name as 'product', cd3.name as 'cat 1', cd2.name as 'cat 2', cd.name as 'cat 3', p.model, p.price
from oc_product_description pd 
join oc_product p on pd.product_id = p.product_id
join oc_product_to_category pc on p.product_id = pc.product_id
join oc_category c on pc.category_id = c.category_id
join oc_category_description cd on c.category_id = cd.category_id
join oc_category c2 on (c.parent_id = c2.category_id)
join oc_category_description cd2 on c.category_id = cd2.category_id
join oc_category c3 on (c2.parent_id = c3.category_id)
join oc_category_description cd3 on c3.category_id = cd3.category_id 
where 
p.status = 1 AND pd.language_id = 2 AND c.status = 1 AND cd.language_id = 2 
AND ((c2.status = 1 AND cd2.language_id = 2) OR c.parent_id = 0) 
AND ((c3.status = 1 AND cd3.language_id = 2) OR c2.parent_id = 0)

Но проблема в том, что он не возвращает продукты только с одной или двумя категориями уровня (c.parent_id = 0 и / или c2.parent_id = 0)

ОБНОВЛЕНИЕ

В итоге я экспортировал 3 разных файла и затем объединил их ... 1-й файл со всеми 3 уровнями категорий, 2-й файл с 2-мя уровнями категорий и 3-й файл столько один уровень категории

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

Пожалуйста, используйте левое соединение вместо соединения, я думаю

select pd.name as 'product', cd3.name as 'cat 1', cd2.name as 'cat 2', cd.name as 'cat 3', p.model, p.price
from oc_product_description pd 
join oc_product p on pd.product_id = p.product_id
join oc_product_to_category pc on p.product_id = pc.product_id
LEFT join oc_category c on pc.category_id = c.category_id
LEFT join oc_category_description cd on c.category_id = cd.category_id
LEFT join oc_category c2 on (c.parent_id = c2.category_id)
LEFT join oc_category_description cd2 on c.category_id = cd2.category_id
LEFT join oc_category c3 on (c2.parent_id = c3.category_id)
LEFT join oc_category_description cd3 on c3.category_id = cd3.category_id 
where 
p.status = 1 
0 голосов
/ 11 октября 2019

что делает его нулевым - это ваша категория 3-го уровня. Добавьте условие к категории 3-го уровня при присоединении.

join oc_category c3 on (c2.parent_id = c3.category_id and c3.category_id != c.category_id)

завершите запрос

select pd.name as 'product', cd3.name as 'cat 1', cd2.name as 'cat 2', cd.name as 'cat 3', p.model, p.price
from oc_product_description pd 
join oc_product p on pd.product_id = p.product_id
join oc_product_to_category pc on p.product_id = pc.product_id
join oc_category c on pc.category_id = c.category_id
join oc_category_description cd on c.category_id = cd.category_id
join oc_category c2 on (c.parent_id = c2.category_id and c2.category_id != c.category_id)
join oc_category_description cd2 on c.category_id = cd2.category_id
join oc_category c3 on (c2.parent_id = c3.category_id and c2.category_id != c.category_id and c3.category_id != c.category_id)
join oc_category_description cd3 on c3.category_id = cd3.category_id 
where p.status = 1 AND pd.language_id = 2 AND c.status = 1 AND cd.language_id = 2 AND 
    ((c2.status = 1 AND cd2.language_id = 2) OR c.parent_id IS NULL) 
    AND ((c3.status = 1 AND cd3.language_id = 2) OR c2.parent_id IS NULL)
...