[MySQL] Join wil niet

Pagina: 1
Acties:

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 12-02 15:52
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:
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]

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 12-02 15:52
Laat de Engelse vertaling maar.. Hij wist ut niet :'(

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 12-02 15:52
Blah, weer een stomme fout :(