16. marts 2005 - 17:50Der er
10 kommentarer og 1 løsning
Select med count
Jeg har en database som har følgende felter:
ID(int) RID(int) Subject(text)
Hvordan kan jeg få ut antall postede svar under id`ene jeg henter ut?
SELECT ID,RID,Subject FROM Entries WHERE RID=0 ORDER By ID ASC
Her henter den ut: 1 0 Debatforum ( antall svar under id 1 ) 9 0 Kategorier ( antall svar under id 9 ) 15 0 Og mange andre ting ( antall svar under id 15 )
Det hadde vært supert om den kunne hente ut alle som er under de igjen også hvis det er mulig.
Så vil jeg at Debatforum (1) ant svar er 7 Re: Debatforum (2) ant svar er 5 Re: Debatforum (3) ant svar er 0 Re: Debatforum (5) ant svar er 3 Re: Debatforum (6) ant svar er 2 Re: Debatforum (7) ant svar er 0 Re: Debatforum (8) ant svar er 0 Re: Debatforum (4) ant svar er 0
Nå, nej. Da jeg fik kigget nærmere på dine links, blev jeg klar over, at det ikke er det du beder om. Men jeg tror til gengæld, at du får svært ved at lave den slags rekursiv databehandling i ren SQL.
Jeg får i hvert fald ondt i hovedet af at tænke på det :-(
Jeg har kigget lidt på det, men vi kigge lidt mere på det i morgen aften, hvids der ikke kommer en bedre løsning inden.
Det vil være ret svært i SQL at lave rekursiv databehandling med dynamisk 'dybde', men du kan eventuelt lave en SQL som tager højde for et bestemt antal niveauer. Nedenfor har jeg vist et eksempel med 6 niveauer. Dette kan nemt udbygges.
Jeg bygger op en matrix i en ny tabel, enties_test. Den første SQL vil vise alle 'slutniveauer'.
select E1.ID as ID1, E2.ID as ID2, E3.ID as ID3, E4.ID as ID4, E5.ID as ID5, E6.ID as ID6 into entries_test From entries E1 left join entries E2 on E1.ID = E2.RID left join entries E3 on E2.ID = E3.RID left join entries E4 on E3.ID = E4.RID left join entries E5 on E4.ID = E5.RID left join entries E6 on E5.ID = E5.RID Where E1.RID = 0
Derefter laver jeg en union hvor jeg checker hvert niveau for ID'er der også har en RID.
insert into entries_test(ID1, ID2,ID3,ID4, ID5, ID6) Select * from ( select distinct ID1, NULL AS ID2, NULL AS ID3,NULL as ID4, NULL as ID5, NULL as ID6 from entries_test WHERE NOT ID1 IS NULL AND NOT ID2 is NULL UNION select distinct ID1, ID2, NULL AS ID3,NULL as ID4, NULL as ID5, NULL as ID6 from entries_test WHERE NOT ID2 IS NULL AND NOT ID3 is NULL UNION select distinct ID1, ID2,ID3,NULL as ID4, NULL as ID5, NULL as ID6 from entries_test WHERE NOT ID3 IS NULL AND NOT ID4 is NULL UNION select distinct ID1, ID2,ID3,ID4, NULL as ID5, NULL as ID6 from entries_test WHERE NOT ID4 IS NULL AND NOT ID5 is NULL UNION select distinct ID1, ID2,ID3,ID4, ID5, NULL as ID6 from entries_test WHERE NOT ID5 IS NULL AND NOT ID6 IS NULL) a
select * from entries_test order by ID1, ID2,ID3,ID4, ID5, ID6 Resultatet i denne tabel bliver:
Fra denne tabel kan man udlede hvor mange svar der er til hvert enkelt ID, samt hierarkiet. Antal svar vil være antal ganger et ID vises i tabellen minus 1 (træk en fra da ID'et ikke skal tælle som svar til sig selv).
-->: lorentsnv: Noget af et projekt du har vovet dig ud i. Men det ser faktisk ikke helt dumt ud. Som du selv siger, så er man dog nødt til at fastsætte et max-niveau. Held og lykke. :-)
-->: mortency: En anden vej, som efter min ringe mening, måske ville have de bedste chancer (selv om lorentsvn også har angivet en vej med potentiale): Lav en stored procedure. Problemet med recursive data er jo, at man skal kunne gemme mellemregninger, hvilket er næsten umuligt i alm. SQL. Det vil være muligt i en stored procedure. Jeg føler mig dog ikke selv kompetent til at prøve at opbygge en sådan i Transact SQL. Men måske andre på dette site har mere kompetence på dette område, og vil påtage sig opgaven.
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.