Ik ben bezig met een onderdeel van een webshop dat een lijst met alle categorieën moet weergeven plus het aantal producten achter een categorie. Nou zijn er 3 relevante tabellen namelijk:
Product: id, title, description, price
nested_category: id, name, lft, rgt
category_map: category_id, product_id //1 product kan in meerdere categorieën, vandaar deze koppeltabel
De query die ik nodig heb moet nested_category.id, nested_category.name, nested_category.left, nested_category.rgt en het aantal producten per
category uit de database halen.
wat wel lukt is een query waar de gewenste resultaten uitkomen echter zonder de categorieën waar geen producten achter zitten:
SELECT parent.name, COUNT(p.title)
FROM nested_category AS node ,nested_category AS parent, product AS p, category_map AS cm
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.id = cm.category_id
AND p.id = cm.product_id
GROUP BY parent.name
ORDER BY node.lft;
Dus het moet sowieso een left join worden. Nou heb ik na wat gekloot de volgende query:
SELECT parent.id, parent.name, parent.lft, parent.rgt, COUNT( cm.product_id ) AS nr_products
FROM nested_category AS node, nested_category AS parent
LEFT JOIN category_map AS cm ON parent.id = cm.category_id
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY parent.id
ORDER BY node.lft
Dit begint erop te lijken maar deze lijkt alleen de producten achter de childnodes (De nodes waar het verschil tussen lft en rgt 1 is...) te tellen
Dus alle kolommen worden correct teruggegeven behalve nr_products
Zelf kom ik er even niet uit dus wat feedback zou wel welkom zijn...
Product: id, title, description, price
nested_category: id, name, lft, rgt
category_map: category_id, product_id //1 product kan in meerdere categorieën, vandaar deze koppeltabel
De query die ik nodig heb moet nested_category.id, nested_category.name, nested_category.left, nested_category.rgt en het aantal producten per
category uit de database halen.
wat wel lukt is een query waar de gewenste resultaten uitkomen echter zonder de categorieën waar geen producten achter zitten:
SELECT parent.name, COUNT(p.title)
FROM nested_category AS node ,nested_category AS parent, product AS p, category_map AS cm
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.id = cm.category_id
AND p.id = cm.product_id
GROUP BY parent.name
ORDER BY node.lft;
Dus het moet sowieso een left join worden. Nou heb ik na wat gekloot de volgende query:
SELECT parent.id, parent.name, parent.lft, parent.rgt, COUNT( cm.product_id ) AS nr_products
FROM nested_category AS node, nested_category AS parent
LEFT JOIN category_map AS cm ON parent.id = cm.category_id
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY parent.id
ORDER BY node.lft
Dit begint erop te lijken maar deze lijkt alleen de producten achter de childnodes (De nodes waar het verschil tussen lft en rgt 1 is...) te tellen
Dus alle kolommen worden correct teruggegeven behalve nr_products
Zelf kom ik er even niet uit dus wat feedback zou wel welkom zijn...