25. juli 2007 - 16:21Der er
30 kommentarer og 1 løsning
kombinere SELECT * med SELECT COUNT hvor post_id er lig givne id
Hej Eksperter.
Jeg er ikke så ferm til strSQL, men jeg går ud fra at man på en eller anden måde kan kombinere følgende 2 kald til databasen og derved spare et recordset: --------------------------------------------------------------- Set rs=Conn.Execute("SELECT [id], [name], [headline], [date] FROM [forum] WHERE [post_id]=0 ORDER BY [date] DESC") Do While Not rs.EOF Set rscount=Conn.Execute("SELECT Count(*) AS [posts] FROM [forum] WHERE [post_id]="&strID) rscount.close rs.MoveNext Loop --------------------------------------------------------------- Dvs. hente antal poster hvor [post_id] = det givne [id].
tjah.. du giver ikke så meget information. F.eks i din første SQL angiver du navne på 4 kolonner, som det ikke ser ud til, at du bruger nogle steder - forvirrende. Du counter i sql nr. 2 men du udskriver ikke værdien og du benytter den heller ikke. også forvirrende.
jeg kan slet ikke meningen i første sql - du laver en where betingelse på "0", men i den anden sql laver du den på en parameter - hvorfor ikke gøre det i den første også?
det du vil have er sikkert meget simpelt, men personligt kan jeg ikke lægge et svar på noget før jeg forstår hvad der skal bruges i alt det der.
Sorry, jeg havde skåret en masse fra. I do-while-løkken benytter jeg resultaterne. Jeg bruger det til at vise en oversigt over forum-indlæg, det vil sige "hovedindlæg" eller "hovedtråde" i forummet. Dette henter jeg med: Set rs=Conn.Execute("SELECT [id], [name], [headline], [date] FROM [forum] WHERE [post_id]=0 ORDER BY [date] DESC") post_id er nul, fordi alle hovedindlæg naturligvis ikke er knyttet til et andet id.
Jeg vil samtidig udskrive, hvor mange svar, der er skrevet til hvert hovedindlæg, derfor min rscount, som skal benytte id fra den første select.
nu har jeg ikke noget, at teste på, men man kan godt ca. sådan her
Set rs=Conn.Execute("SELECT [id], [name], [headline], [date], (SELECT Count(*) FROM [forum] WHERE [post_id]="&strID &") as [posts] FROM [forum] WHERE [post_id]=0 ORDER BY [date] DESC") Do While Not rs.EOF
select DownloadTitel, count(*) as antal from Downloads group by (DownloadTitel)
Set rs=Conn.Execute("SELECT [id], [name], [headline], [date], count(*) as [posts] FROM [forum] WHERE [post_id]=0 GROUP BY ([id], [name], [headline], [date]) ORDER BY [date] DESC")
Først fik jeg: Syntax error (comma) in query expression '([id], [name], [headline], [date])'. Så fjernede jeg parentesen omkring disse, men nu indeholder[posts] kun værdien 1 uanset hvor mange svar, jeg opretter.
Der mangler vel også et eller andet i sql'en, som fortæller at count(*) skal knyttes til alle med [post_id]=givne id, eller hvad? Er ikke så meget inde i, præcis hvordan group by virker.
hov.. ja det er fordi du har "date" med.. der er sikkert tid i den ikke?
så vil den desværre ikke fungere i group by..
prøv lige for sjov sådan her
Set rs=Conn.Execute("SELECT [id], [name], [headline], count(*) as [posts] FROM [forum] WHERE [post_id]=0 GROUP BY [id], [name], [headline] ORDER BY [date] DESC")
Så får jeg fejl, hvis jeg henter [date], fordi den ikke er sat til at blive hentet naturligvis. Hvis jeg henter den får jeg samme fejlmeddelelse om noget med Aggregate Function, og hvis jeg sletter den, ser det ud som før, hvor [posts] kun indeholder "1".
okay - det godt du slettede den for det var det som jeg gerne ville se.
Det er lidt mystisk for det fungerer fint her og det burde vel fungere på samme måde i access.
hvis vi nu tager den som virkede næsten - ved ikke om den godtager dette.
Set rs=Conn.Execute("SELECT [id], [name], [headline], [date], (SELECT Count(*) FROM [forum] WHERE [post_id]="&strID &") as [posts] FROM [forum] WHERE [post_id]=0 and [id] = [id] ORDER BY [date] DESC") Do While Not rs.EOF
Set rs=Conn.Execute("SELECT [id], [name], [headline], [date], (SELECT Count(*) FROM [forum] WHERE [post_id]= [id]) as [posts] FROM [forum] WHERE [post_id]=0 ORDER BY [date] DESC") Do While Not rs.EOF
Ok, altså alle poster har naturligvis et [id]. Hvis de er et hovedindlæg i forummet, så har de [post_id]=0, eftersom de ikke hører under andre indlæg, men hvis de er svar på et indlæg, så har de [post_id]="hoved-indlæggets id"
På den måde kan jeg se, hvilke svar der knytter sig til hvilke indlæg.
Dvs. både indlæg og svar ligger i samme tabel for at spare plads. Og [post_id] er altså ikke unikt - mange poster kan sagtens have samme post_id, fordi de knytter sig til samme indlægs id.
Når jeg udskriver står der præcis det samme: SELECT [id], [name], [headline], [date], (SELECT Count(*) FROM [forum] WHERE [post_id]= [id]) as [posts] FROM [forum] WHERE [post_id]=0 ORDER BY [date] DESC
Vi indsætter jo heller ikke nogen variabler i den. Eller har jeg misforstået?
den sql synes jeg nemlig er rimelig korrekt. problemet med det databasedesign du har valgt er, at den ikke er normaliseret. Hvis det var det kunne man joine det som hører sammen og lave en ret simpel sql til det:)
det tætteste jeg tror man kan komme ellers er dette - og den er jo langt fra optimal.
SELECT [name], [headline], count(*) as [posts] + 1 FROM [forum] WHERE [post_id] != 0 GROUP BY [name], [headline] ORDER BY [date] DESC
Umiddelbart synes jeg den mest logiske måde at knytte de to forespørgsler sammen ville være at lave en self-join konstruktion som denne:
SELECT f1.[id], f1.[name], f1.[headline], f1.[date], COUNT(*) AS [posts] FROM [forum] AS f1 LEFT JOIN [forum] AS f2 ON f1.id = f2.[post_id] WHERE f1.[post_id]=0 GROUP BY f1.[id], f1.[name], f1.[headline], f1.[date] ORDER BY f1.[date] DESC
Det burde være lidt mere effektivt end kalps løsning med en subselect.
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.