Ik heb 2 tabellen, categories en products. In de categories tabel worden volgens het nested-set model de categorieën opgeslagen.
Ik vraag nu met de volgende query op welke categorieën er zijn en op welk level die zit:
Daarmee krijg ik een prima resultaat:
In de productentabel staan dus de producten (doh) met bij elk product een categorie.
Wat ik nu wil, is 1 query die het vorige resultaat weergeeft, met als additie het aantal producten in de categorie. Zoiets dus
Daarvoor heb ik zelf onder andere de volgende query geprobeerd:
Deze query kwam het beste bij het goeie resultaat uit:
Maar zoals je ziet: level klopt niet meer
Wie o wie weet wel hoe de query moet?
[edit]Tweede dump aangepast: Het aantal producten dat ik krijg met mijn 'foute' query klopt wel, alleen het level dus niet[/edit]
Ik vraag nu met de volgende query op welke categorieën er zijn en op welk level die zit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| SELECT t1.categoryid, t1.categoryname, t1.lft, t1.rgt, count(t2.categoryid) AS level FROM categories AS t1 LEFT JOIN categories AS t2 ON ( t1.lft > t2.lft AND t1.rgt < t2.rgt) GROUP BY t1.categoryid ORDER BY t1.lft |
Daarmee krijg ik een prima resultaat:
code:
1
2
3
4
5
6
7
8
9
| +------------+-----------------+-----+-----+-------+ | categoryid | categoryname | lft | rgt | level | +------------+-----------------+-----+-----+-------+ | 1 | Behuizing | 1 | 6 | 0 | | 2 | Enlight | 2 | 3 | 1 | | 3 | Palo | 4 | 5 | 1 | | 4 | CD-Rom | 7 | 8 | 0 | | 5 | Controllers | 9 | 10 | 0 | .................................................... |
In de productentabel staan dus de producten (doh) met bij elk product een categorie.
Wat ik nu wil, is 1 query die het vorige resultaat weergeeft, met als additie het aantal producten in de categorie. Zoiets dus
code:
1
2
3
4
5
6
7
8
| +------------+-----------------+-----+-----+-------+----------+ | categoryid | categoryname | lft | rgt | level | products | +------------+-----------------+-----+-----+-------+----------+ | 1 | Behuizing | 1 | 6 | 0 | 0 | | 2 | Enlight | 2 | 3 | 1 | 9 | | 3 | Palo | 4 | 5 | 1 | 4 | | 4 | CD-Rom | 7 | 8 | 0 | 2 | ............................................................... |
Daarvoor heb ik zelf onder andere de volgende query geprobeerd:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| SELECT t1.categoryid, t1.categoryname, t1.lft, t1.rgt, count(t2.categoryid) AS level, count(t3.productid) AS products FROM categories AS t1 LEFT JOIN categories AS t2 ON (t1.lft > t2.lft AND t1.rgt < t2.rgt) LEFT JOIN products AS t3 ON (t1.categoryid = t3.categoryid) GROUP BY t1.categoryid, t3.categoryid ORDER BY t1.lft |
Deze query kwam het beste bij het goeie resultaat uit:
code:
1
2
3
4
5
6
7
8
| +------------+-----------------+-----+-----+-------+----------+ | categoryid | categoryname | lft | rgt | level | products | +------------+-----------------+-----+-----+-------+----------+ | 1 | Behuizing | 1 | 6 | 0 | 0 | | 2 | Enlight | 2 | 3 | 9 | 9 | | 3 | Palo | 4 | 5 | 4 | 4 | | 4 | CD-Rom | 7 | 8 | 0 | 2 | ............................................................... |
Maar zoals je ziet: level klopt niet meer
Wie o wie weet wel hoe de query moet?
[edit]Tweede dump aangepast: Het aantal producten dat ik krijg met mijn 'foute' query klopt wel, alleen het level dus niet[/edit]