Avatar billede w13 Novice
25. juli 2007 - 16:21 Der 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].

Håber I kan hjælpe mig.
Avatar billede kalp Novice
25. juli 2007 - 17:00 #1
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.
Avatar billede kalp Novice
25. juli 2007 - 17:01 #2
Set rs = Conn.Execute("SELECT count(*) as [posts] FROM [forum] WHERE [post_id]= " & strID & " ORDER BY [date] DESC")

sådan her forstår jeg det du prøver på.
Avatar billede kalp Novice
25. juli 2007 - 17:02 #3
Set rs = Conn.Execute("SELECT count(*) as [posts] FROM [forum] WHERE [post_id]="&strID)

bare sådan der - medmindre det der id kan komme flere gange..så skal det være den anden.
Avatar billede w13 Novice
25. juli 2007 - 17:06 #4
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.
Avatar billede kalp Novice
25. juli 2007 - 17:13 #5
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
 
  rscount.close
  rs.MoveNext
Loop
Avatar billede w13 Novice
25. juli 2007 - 17:15 #6
Ah okey. Dog er der det problem, at strID i min kode (hvilket jeg også glemte at skrive) indeholder [id] fra den første SELECT. Hvordan løser jeg det?
Avatar billede kalp Novice
25. juli 2007 - 17:19 #7
se lige præcis det var også en af de ting, som jeg fandt mystisk og uforståeligt;D

men så skal sql'en ikke se sådan ud.. det skal grupperes og countes.. lad mig tænke
Avatar billede kalp Novice
25. juli 2007 - 17:22 #8
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")
Avatar billede kalp Novice
25. juli 2007 - 17:23 #9
blah.. glem den første linje.. det er min test:D
Avatar billede w13 Novice
25. juli 2007 - 17:32 #10
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.
Avatar billede kalp Novice
25. juli 2007 - 17:37 #11
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")
Avatar billede w13 Novice
25. juli 2007 - 17:41 #12
You tried to execute a query that does not include the specified expression '[date]' as part of an aggregate function.
Avatar billede kalp Novice
25. juli 2007 - 17:43 #13
Set rs=Conn.Execute("SELECT [id], [name], [headline], count(*) as [posts] FROM [forum] WHERE [post_id]=0 GROUP BY [id], [name], [headline]")
Avatar billede w13 Novice
25. juli 2007 - 17:57 #14
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".

Shit..
Avatar billede w13 Novice
25. juli 2007 - 17:57 #15
"Så får jeg fejl, hvis jeg henter [date]" = "Så får jeg fejl, når jeg prøver at vise [date]"
Avatar billede kalp Novice
25. juli 2007 - 18:12 #16
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
 

  rs.MoveNext
Loop
Avatar billede w13 Novice
25. juli 2007 - 18:14 #17
Der skal også lige gøres noget ved: [post_id]="&strID &"
eftersom strID jo ikke er sat og er afhængig af den udhentede [id].
Avatar billede kalp Novice
25. juli 2007 - 18:24 #18
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
 

  rs.MoveNext
Loop


mig som rodede
Avatar billede w13 Novice
25. juli 2007 - 18:30 #19
Hmm. Nu er der ingen fejl, men [posts] er altid lig med 0.
Avatar billede kalp Novice
25. juli 2007 - 18:33 #20
ja og må indrømme det har noget, at gøre med jeg ikke helt kan se hvad forskellen er på

[id] og [post_id]

gør det lige tydeligt hvad der er hvad=)
Avatar billede w13 Novice
25. juli 2007 - 18:43 #21
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.
Avatar billede w13 Novice
25. juli 2007 - 18:50 #22
Eksempel på tabellen forum:
|-----------------------------------------------------------------------------------|
|    id    |    post_id    |    name    |    headline    |    text    |    date    |
|-----------------------------------------------------------------------------------|
|    1    |      0      |    W13    |  Velkommen!  | Bla bla... | 25/07/2007  |
|-----------------------------------------------------------------------------------|
|    2    |      1      |    Jens    | Sv: Velkommen! | Tak!...    | 25/07/2007  |
|-----------------------------------------------------------------------------------|
|    3    |      1      |    Niels  | Sv: Velkommen! | Ja, tak!  | 25/07/2007  |
|-----------------------------------------------------------------------------------|
|    4    |      0      |    W13    |    Hjælp!    | Bla bla... | 25/07/2007  |
|-----------------------------------------------------------------------------------|
Avatar billede w13 Novice
25. juli 2007 - 18:50 #23
Den så lidt pænere ud, da jeg skrev den. :)
Avatar billede kalp Novice
25. juli 2007 - 19:03 #24
vil du gøre mig en tjeneste og udskrive denne sql?

Kommentar: kalp
25/07-2007 18:24:04

så vi kan se hvad der står i den af værdier
Avatar billede w13 Novice
25. juli 2007 - 19:17 #25
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?
Avatar billede kalp Novice
25. juli 2007 - 19:25 #26
det mig som stener -

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


så umiddelbart vil jeg mene det ser skidt ud
Avatar billede w13 Novice
25. juli 2007 - 19:33 #27
Nå, ja, æv, det er der jo så ikke noget at gøre ved. Det må så fylde de 2 linjer ekstra + et ekstra recordset.

Men du får da pointene som tak for hjælpen, hvis du lige opretter svar.
Avatar billede kjulius Novice
25. juli 2007 - 19:37 #28
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.
Avatar billede kalp Novice
25. juli 2007 - 19:41 #29
kjulius >>

hvis man kan få det til, at virke på den måde så kan jeg da lige takke dig for, at have lært noget nyt i dag:D

skyldes, at jeg aldrig har overvejet, at joine en tabel med sig selv!
Avatar billede w13 Novice
25. juli 2007 - 19:48 #30
Det virker søreme. :) Heldigt for mig. Hvis du lige opretter svar, Kjulius.
Avatar billede kjulius Novice
25. juli 2007 - 20:29 #31
S'gerne... :-)
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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