Avatar billede oasen Nybegynder
22. august 2002 - 20:47 Der er 20 kommentarer og
1 løsning

Join en 3. tabel!?

Jeg har illustreret min tabel-opsætning her http://80.196.131.173/pics/dbshot.jpg for at gøre det lettere at svare.

Problemstillingen er sådan set simpel; Jeg skal have tilføjet tabellen "brugerbesoegtab" til nedenstående SQL, således, at brugerne kan sorteres efter antallet af deres forekomster i kolonnen "VaertID". Altså hvor mange gange deres unikke brugerID i tabellen "profiltab" befinder sig i kolonnen "VaertID".
Nogen der er i stand til at hjælpe med det?
Avatar billede oasen Nybegynder
22. august 2002 - 20:50 #1
Glemte lige SQL'en:

SQL = "Select Top 20 profiltab.BrugerID, profiltab.Brugernavn, profiltab.Bopael, profiltab.Alder, profiltab.Koen, profiltab.Status, Sum(brugerpicstab.VistPic) As VistePics, Sum(brugerpicstab.FavoritPic) As FavoritPics, Sum(brugerpicstab.ProfilPic) As ProfilPic "

SQL = SQL & "From profiltab Left Join brugerpicstab On profiltab.BrugerID = brugerpicstab.BrugerID "

SQL = SQL & "Group By profiltab.BrugerID, profiltab.Brugernavn, profiltab.Bopael, profiltab.Alder, profiltab.Koen, profiltab.Status "

SQL = SQL & "Order By Sum(brugerpicstab.VistPic) Desc"
Avatar billede eagleeye Praktikant
22. august 2002 - 23:21 #2
Men denne SQL komme antalet af deres brugerID i en kolonne med navnet AntalAfVaertID:



SQL = "SELECT TOP 20 profiltab.BrugerID, profiltab.Brugernavn, profiltab.Bopael, profiltab.Alder, profiltab.koen, profiltab.status, Sum(brugerpicstab.VistPic) AS VistePics, Sum(brugerpicstab.FavoritPic) AS FavoritPics, Sum(brugerpicstab.ProfilPic) AS ProfilPic, Count(brugerbesoegtab.VaertID) AS AntalAfVaertID "

SQL = SQL & "FROM (profiltab LEFT JOIN brugerpicstab ON profiltab.BrugerID = brugerpicstab.BrugerID) LEFT JOIN brugerbesoegtab ON profiltab.BrugerID = brugerbesoegtab.VaertID "

SQL = SQL & "GROUP BY profiltab.BrugerID, profiltab.Brugernavn, profiltab.Bopael, profiltab.Alder, profiltab.koen, profiltab.status "

SQL = SQL & "ORDER BY Sum(brugerpicstab.VistPic) DESC"
Avatar billede oasen Nybegynder
22. august 2002 - 23:47 #3
Den skal så se sådan ud, og det var faktisk også det, jeg selv nåede frem til:

SQL = SQL & "ORDER BY Count(brugerbesoegtab.VaertID) DESC"

Men der returneres nogle fuldstændig vilde værdier. F.eks. angives det at en brugers ID indgår 64546 gange i kolonnen "VaertID", selvom der kun er ca. 13000 records.
Har du en forklaring på det, eller skal jeg prøve at uddybe lidt?
Avatar billede eagleeye Praktikant
22. august 2002 - 23:50 #4
Det lyder af mange :) hvordan ser SQL'en ud som giver antallet er det med Sum eller Count?
Avatar billede eagleeye Praktikant
22. august 2002 - 23:56 #5
Det jeg mener hvis du bruger Sum(brugerbesoegtab.VaertID) så bliver det hurtigt til mange hvis VaerID er 100 og det står der 10 gange så giver det 1000. Eller buger du Count(brugerbesoegtab.VaertID) ?
Avatar billede oasen Nybegynder
22. august 2002 - 23:57 #6
Count :) Grunden til at jeg har brugt sum nogle steder er såmænd bare at posterne, der indeholder et 1-tal skal tælles, og så er det jo underordnet om der bruges count eller sum.
Så sum kan uden videre ændres til count. Det forandrer intet.
Avatar billede oasen Nybegynder
22. august 2002 - 23:59 #7
Der skal *kun* sorteres efter tabellen "brugerbesoegtab", men der sker mærkelige ting, når den joines med de to andre tabeller.
Sort-klausulen skal blot se sådan ud:

SQL = SQL & "ORDER BY Count(brugerbesoegtab.VaertID) DESC"
Avatar billede eagleeye Praktikant
23. august 2002 - 00:01 #8
Count ville også tælle de rækker sammen som hvor der ikke står et 1 tal, så det kommer an på formålet.
Avatar billede oasen Nybegynder
23. august 2002 - 00:02 #9
Ja, okay - så skal det selvfølgelig hedde count where kolonne = 1 osv., men det virker fint (uden den tredje tabel)...?
Avatar billede eagleeye Praktikant
23. august 2002 - 00:09 #10
Nemlig.. Ja jeg har prøvet at smide lidt data i en databasen og der sker noget sjovt den fylder det samme i VistePic som i AntalVaertID

Nå jeg smutter i seng nu..
Avatar billede oasen Nybegynder
23. august 2002 - 00:10 #11
Jeg hopper i seng nu, men jeg håber du har lyst til at kigge ind senere...
Avatar billede oasen Nybegynder
23. august 2002 - 00:11 #12
Ja.. jeg forstår det ikke... Godnat ;)
Avatar billede oasen Nybegynder
23. august 2002 - 00:35 #13
Jeg uddyber lige en smule :)

Alle Brugere fra "profiltab" skal altid udskrives uanset om deres ID indgår i de andre tabeller.
Ethvert ID i disse to tabeller findes altid i "profiltab".
Findes et ID ikke i "brugerpicstab" eller "brugerbesoegtab" skal count bare returnere værdien nul.
Jeg kan lave en tabel, der ser ud som det recordsæt, jeg gerne vil have bygget op, hvis det gør det lidt nemmere...
Avatar billede oasen Nybegynder
23. august 2002 - 21:03 #14
Kunne man lave noget smart med Union eller lign. måske?
Avatar billede eagleeye Praktikant
24. august 2002 - 11:28 #15
Det går ikke med UNIOIN den bruges til at ligge to SELCECT efter hinaden i et recordset. Hvis man bruger JOIN så vil den tage alle records med fra tabellen brugerbesoegtab. Dette vil medføre at eks vis count og sum bliver forkerte, et lille eks:

brugertabellen:
brugerID  vistPic
  1          10
  2          2

brugerbesoegtab tabellen:
VaertID
  1
  1
  1
  2
  2

og den samlede tabel før count og sum bliver udført og efter JOIN (LEFT JOIN brugerbesoegtab ON profiltab.BrugerID = brugerbesoegtab.VaertID):
brugerID vistPic vaertID
  1        10      1
  1        10      1
  1        10      1
  2        2      2
  2        2      2

Så man så Counter og Summere:
brugerID vistPic vaertID
  1        30      3
  2        4      2


Så man skal på en eller anden måde at lave det med at SELECT'e fra to tabeller noget i stil med dette men jeg har ikke fået det til at virke..:

SQL = "Select Top 20 profiltab.BrugerID, profiltab.Brugernavn, profiltab.Bopael, profiltab.Alder, profiltab.Koen, profiltab.Status, Sum(brugerpicstab.VistPic) As VistePics, Sum(brugerpicstab.FavoritPic) As FavoritPics, Sum(brugerpicstab.ProfilPic) As ProfilPic, brugerbesoegtab.VaertID "

SQL = SQL & "From brugerbesoegtab, profiltab Left Join brugerpicstab On profiltab.BrugerID = brugerpicstab.BrugerID "

SQL = SQL & "Group By profiltab.BrugerID, profiltab.Brugernavn, profiltab.Bopael, profiltab.Alder, profiltab.Koen, profiltab.Status "

SQL = SQL & "Order By Sum(brugerpicstab.VistPic) Desc"
Avatar billede oasen Nybegynder
24. august 2002 - 16:04 #16
Nej, det vil den ikke være med til... Jeg troede ellers det var en meget almindelig procedure!?
Avatar billede oasen Nybegynder
24. august 2002 - 16:55 #17
Har du lyst til at forsøge mere?
Du må naturligvis gerne få flere points, men du har måske ikke tid...?
Avatar billede eagleeye Praktikant
24. august 2002 - 21:37 #18
hmm er det kun mig som har haft problemmer med eksperten de sidste par dage.. jeg har ikke kunnet logge ind i et par timer?


Jeg har prøvet lidt forskelligt, men jeg kan ikke få det i en SQL. Jeg har prøvet at lave en SQL sætning den som du har vist og gemt den i en Query/Forespørgelse i Access med navnet spm249282. Så har jeg lave denne SQL i en ASP side og så kan jeg få det til at virke med så det kræver jo så at databasen kan/må samt du vil have at den bruger en stored SQL som hjælp til en SQL forspørgelse..:

SQL = "SELECT TOP 20 Count(brugerbesoegtab.VaertID) AS AntalOfVaertID, spm249282.BrugerID, spm249282.Brugernavn, spm249282.Bopael, spm249282.Alder, spm249282.Koen, spm249282.Status, spm249282.VistePics, spm249282.FavoritPics, spm249282.ProfilPic "

SQL = SQL & "FROM spm249282 LEFT JOIN brugerbesoegtab ON spm249282.BrugerID = brugerbesoegtab.VaertID "

SQL = SQL & "GROUP BY spm249282.BrugerID, spm249282.Brugernavn, spm249282.Bopael, spm249282.Alder, spm249282.Koen, spm249282.Status, spm249282.VistePics, spm249282.FavoritPics, spm249282.ProfilPic "

SQL = SQL & "ORDER BY Count(brugerbesoegtab.VaertID) DESC;"
Avatar billede oasen Nybegynder
25. august 2002 - 18:05 #19
Ja, Eksperten er begyndt at gå ned oftere og oftere. Du må høre forsikringsselskabet, om de dækker tabt point-fortjeneste ;)

Det virker præcis, som det skal nu!
Jeg ville selvfølgelig stadig mene, at det er mere elegant med én SQL i ASP-filen. Men det vigtigste er, det virker.

Er det muligt at lave et tilsvarende "trick" i MS SQL?

Jeg siger mange tak for hjælpen!
Hvis du føler, det er mere end 120 point værd, så sig lige til :)
Avatar billede eagleeye Praktikant
25. august 2002 - 20:04 #20
LOL ja gad vide havd en sådan forsikring koster.

Jeg ved faktisk ikke om man kan det i MS SQL. Men så vidt jeg kan se er der noget som hedder stored procedures så det er måske muligt.
Avatar billede oasen Nybegynder
25. august 2002 - 21:49 #21
Okay - men hvis databasen understøtter det, er det faktisk en ret smart metode, som også kan spare kode i ASP-filerne.
Tak endnu en gang :)
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
Kurser inden for grundlæggende programmering

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