MySQL se alătură produselor cu arbore de categorii chiar dacă categoriile sunt nule (Programare, Mysql, Sql, A Se Alătura, Opencart)

thelaw a intrebat.

Doresc să export toate produsele dintr-un Open Cart bază de date cu categoriile lor părintești. Tabelele mele sunt:

oc_product_description (product_id, name, language ….)

oc_product (product_id, model, preț, status …)

oc_product_to_category (product_id, category_id)

oc_category (category_id, status ….)

oc_category_description (category_id, name, language_id …)

Iată codul meu de până acum:

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)

Dar problema este că nu returnează produsele cu doar un singur nivel sau două categorii (c.parent_id = 0 și/sau c2.parent_id = 0)

UPDATE

Am ajuns să export 3 fișiere diferite și apoi să le îmbin… Primul fișier cu toate cele 3 niveluri de categorii, al doilea fișier cu 2 niveluri de categorii și al treilea fișier cu un singur nivel de categorie

Comentarii

  • Zero nu este NULL. PS Vă rog ca în întrebările de cod să dați un exemplu minim reproductibil – tăiați &; lipiți &; cod executabil; exemplu de intrare (ca și cod de inițializare) cu ieșire dorită &; ieșire reală (inclusiv mesaje de eroare textuale); etichete &; versiuni; specificații clare &; explicații. Aceasta include cel mai puțin cod pe care îl puteți da, care este cod care arată că este OK extins de cod care arată că nu este OK. (Depanarea este fundamentală.) Pentru SQL, care include SGBD/produs &; DDL, care include constrângeri &; indici &; inițializare în format tabular. –  > Por philipxy.
2 răspunsuri
Ed Bangga

ceea ce îl face nul este categoria dvs. de nivel 3. Adăugați condiția la categoria dvs. de nivelul 3 atunci când vă alăturați.

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

interogare completă

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)

Rakib

Vă rugăm să folosiți left join în loc de join, cred.

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 

Comentarii

  • am încercat asta deja, dar nu a funcționat… și am nevoie de where parte în întregime –  > Por thelaw.
  • Puteți să-mi spuneți, vă rog, cerințele dvs. în detaliu? Mă refer la formatul de ieșire… –  > Por Rakib.
  • folosiți c.parent_id =0 sau c2.parent_id=0. Din câte știu eu parent_id este 0 not null în tabelul oc category –  > Por Rakib.