Avatar billede 17196 Nybegynder
19. oktober 2008 - 16:49 Der er 7 kommentarer og
1 løsning

self-join der tæller antal "childs"

Jeg skal have fundet det specifikke child-count for hver af mine rækker. Jeg har forsøgt mig med følgende, men får vist brug for hjælp, da min query returnere det overordnede child-count i stedet.

SELECT *, sub.childCount FROM `thread`,
(SELECT COUNT(t2.id) as childCount FROM thread t, thread t2 WHERE t.parent_id = t2.id AND t.parent_id != 0) as sub

tabel indhold:
-id
-parent_id
-description
Avatar billede w13 Novice
19. oktober 2008 - 17:14 #1
Hvad mener du med overordnet child-count? Får du kun talt poster med parent_id = 0 eller får du alle poster talt?

Jeg har lidt svært ved at overskue det, men din WHERE skal måske være:

WHERE t2.parent_id = t.id AND t2.parent_id != 0
Avatar billede w13 Novice
19. oktober 2008 - 17:14 #2
Og er der behov for:
t2.parent_id != 0
når du tester med:
t2.parent_id = t.id
?
Avatar billede 17196 Nybegynder
19. oktober 2008 - 17:34 #3
Min test data består af 4 rækker, hvor id 3 og 4 er child til id 2.

Med overordned mener jeg at queryen returnerer 2 som childcount til alle rækker (også med din rettelse). Til din anden kommentar, har du ret, t2.parent_id må selvfølgelig gerne være 0 (default value).
Avatar billede 17196 Nybegynder
19. oktober 2008 - 17:36 #4
Og så burde det være t.parent_id = t2.id
Avatar billede w13 Novice
19. oktober 2008 - 17:38 #5
Så problemet er, at alle børn tælles med for alle poster, right?
Avatar billede 17196 Nybegynder
19. oktober 2008 - 17:39 #6
ja, korrekt
Avatar billede recli Nybegynder
22. oktober 2008 - 14:02 #7
Hej

Hvis jeg forstår dig ret, ser din tabel med data ca. sådan her ud:

mysql> select * from id_test;
+----+-----------+
| id | parent_id |
+----+-----------+
|  1 |        0 |
|  2 |        0 |
|  3 |        2 |
|  4 |        2 |
|  5 |        1 |
|  6 |        3 |
|  7 |        3 |
|  8 |        7 |
|  9 |        7 |
+----+-----------+


Det, du gerne vil have frem, er en sammentælling i følgende stil, hvor du kan se, at id 1 har 1 'barn', dvs. der er en række, der peger på id 1 som parent_id:

|  1 |        1 |
|  2 |        2 |
|  3 |        2 |
|  4 |        0 |
|  5 |        0 |
|  6 |        0 |
|  7 |        2 |
|  8 |        0 |
|  9 |        0 |


Hvis jeg har forstået det ret, kan du med følgende forespørgsel, få lavet en opstilling som den ovenstående:

select t1.id, count(t2.parent_id) from id_test as t1 left join id_test as t2 on (t1.id=t2.parent_id) group by t1.id;

Jeg har kaldt min tabel 'id_test'.

Hilsen
  /recli
Avatar billede 17196 Nybegynder
22. oktober 2008 - 20:11 #8
Takker for indsatsen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester