16. marts 2005 - 17:50
Der 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.
Se
http://www.html.dk/scripts/asp/00015///Morten
16. marts 2005 - 18:08
#4
Hvis du se her
http://www.html.dk/scripts/asp/00015/eksempel.aspSå 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
OSV.............
16. marts 2005 - 18:22
#5
Hvordan knytter jeg disse to sammen til en query?
SELECT ID,RID,Subject FROM Entries WHERE RID=0 ORDER By ID ASC
SELECT COUNT(ID) as NoAnswers,RID FROM Entries GROUP BY RID
16. marts 2005 - 20:12
#6
SELECT ID, Subject, COUNT(DISTINCT RID) - 1 AS NoAnswers
FROM Entries
GROUP BY ID, Subject
ORDER BY ID ASC
?
16. marts 2005 - 20:48
#7
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 :-(
17. marts 2005 - 02:04
#8
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:
ID1 ID2 ID3 ID4 ID5 ID6
----------- ----------- ----------- ----------- ----------- -----------
1 NULL NULL NULL NULL NULL
1 2 NULL NULL NULL NULL
1 2 3 NULL NULL NULL
1 2 5 NULL NULL NULL
1 2 5 6 NULL NULL
1 2 5 6 7 NULL
1 2 5 6 8 NULL
1 4 NULL NULL NULL NULL
(8 row(s) affected)
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).
Kan du bruge noget i denne rætning?
17. marts 2005 - 09:06
#9
-->: 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.