Avatar billede oasen Nybegynder
08. juli 2002 - 11:10 Der er 24 kommentarer og
2 løsninger

Where Clause

Jeg skal udtrække en række poster fra tabel1 - men de skal sorteres ud fra oplysninger i tabel2. F.eks.:

strSQL = "Select Count(BrugerID), BrugerID From brugerpicstab Where Handling = 'V' Group By BrugerID Order By Count(BrugerID) Desc"
Set rs = ConnPic.Execute(strSQL)
Do While Not rs.EOF
              strSQL = "Select * From profiltab Where BrugerID = " & rs("BrugerID")
            Set rsProfil = Conn.Execute(strSQL)
  Response.Write rsProfil("Brugernavn")
rs.MoveNext
Loop

Det må kunne laves med knap så meget "overkill", men hvordan?
Avatar billede zeptic Nybegynder
08. juli 2002 - 11:32 #1
strSQL= "SELECT Count(brugerpicstab.BrugerID), brugerpicstab.BrugerID, profiltab.Brugernavn  From brugerpicstab, profiltab Where Handling='V' AND profiltab.BrugerID=brugerpictab.BrugerID Group By BrugerID Order By Count(brugerpicstab.BrugerID) Desc"

Set rs = ConnPic.Execute(strSQL)
Do While Not rs.EOF
Response.Write rs("Brugernavn")
rs.MoveNext
Loop
Avatar billede eagleeye Praktikant
08. juli 2002 - 11:32 #2
Ja men du får en større SQL sætning, du kan gøre det med JOIN muligheden hvor man kan JOIN'ne en tabel på en anden:

Her er SQL sætningen, du må selv lige sætte den ind i strSQL ="..."

SELECT Count(brugerpicstab.brugerID) AS AntalBrugerID, brugerpicstab.brugerID, profiltab.brugernavn
FROM brugerpicstab LEFT JOIN profiltab ON brugerpicstab.brugerID = profiltab.brugerID
WHERE (((brugerpicstab.handling)='V'))
GROUP BY brugerpicstab.brugerID, profiltab.brugernavn
ORDER BY Count(brugerpicstab.brugerID) DESC;
Avatar billede zeptic Nybegynder
08. juli 2002 - 11:34 #3
På denne måde får du databasen til at lave hele arbejdet, hvilket er _meget_ mere effektivt.

Der skal selvfølgelig også stå: ... Group By brugerpicstab.BrugerID ...
Avatar billede oasen Nybegynder
08. juli 2002 - 11:50 #4
Ok, men hvordan skaber jeg recordsættet? - tabellerne ligger i forskellige databaser...

Select Tabel1.Data1, Tabel2.Data3 From Tabel1,Tabel2 Where Tabel1.Data2=tabel2.Data4 Order By Tabel1.Data2

Er det selve syntaksen?
Avatar billede oasen Nybegynder
08. juli 2002 - 11:54 #5
Glem det med recordsættet - det er jo indlysende nok...
Avatar billede eagleeye Praktikant
08. juli 2002 - 12:00 #6
Jeg vil klart anbefale at bruge JOIN så ved du med 100% sikkerhed hvordan dit recordset kommer til at se ud. Ligeledes kan du bruge WHERE delen til at vælge de rigtige recordset og ikke bruge den til at sætte to tabeller lig hinanden. Lige i dette tilfælde vil det gå godt da brugerID er i begge tabeller og du kun ønsker at få brugernavn ud hvis der er et Count. Den ville eksvis ikke virke hvis du vil havde alle brugernavne ud selv om brugerID ikke er i brugerpicstab tabellen.
Avatar billede eagleeye Praktikant
08. juli 2002 - 12:01 #7
strSQL = "SELECT Count(brugerpicstab.brugerID) As AntalBrugerID, brugerpicstab.brugerID, profiltab.brugernavn "
strSQL  = strSQL & "FROM brugerpicstab LEFT JOIN profiltab ON brugerpicstab.brugerID = profiltab.brugerID "
strSQL  = strSQL & "WHERE (((brugerpicstab.handling)='V')) "
strSQL  = strSQL & "GROUP BY brugerpicstab.brugerID, profiltab.brugernavn "
strSQL  = strSQL & "ORDER BY Count(brugerpicstab.brugerID) DESC;"

Set rs = ConnPic.Execute(strSQL)
Do While Not rs.EOF
  Response.Write rsProfil("Brugernavn")
  rs.MoveNext
Loop
Avatar billede eagleeye Praktikant
08. juli 2002 - 12:02 #8
Hvis du har flere kolonner i profiltab du vil havde med i SQL-sætningen skal de tilføjes i SELECT .. og GROUP BY:

SELECT ..., profiltab.brugernavn, profiltab.NyKolonne
..
..
GROUP BY ..., profiltab.brugernavn, profiltab.NyKolonne


---
Hvis du ikke behøver at havde brugerID og Antallet som den har fundet ved Count kan du fjerne dem fra SELECT så den kun vælger brugernavn og evt andre kolonner:

SELECT profiltab.brugernavn
FROM brugerpicstab .....
...
...;
Avatar billede oasen Nybegynder
08. juli 2002 - 15:52 #9
Jeg poster lige den færdige SQL lidt senere - der skal nemlig inkluderes en masse.
Avatar billede oasen Nybegynder
08. juli 2002 - 16:41 #10
Jo, nu bliver jeg nødt til at spørge alligevel. Hvordan skabes recordsættet?
Hvis jeg siger "Conn.Execute(strSQL)", kan den anden input-DB ikke findes - altså ConnPic. Hvad gør jeg?
Avatar billede eagleeye Praktikant
08. juli 2002 - 17:32 #11
Er de to tabeller i hver sig database ??
Avatar billede oasen Nybegynder
08. juli 2002 - 17:46 #12
Jeg har lige lagt tabellerne i samme database.
Så vidt jeg ved, plejer man at adskille SQL'erne med semikolon, men det kan vist ikke lade sig gøre i Access.
Har du lyst til at se hele SQL'en, hvis jeg poster den her (sammen med fejlbeskrivelsen)?
Avatar billede oasen Nybegynder
08. juli 2002 - 17:53 #13
Det er et vigtigt led i en avanceret søgefunktion, så SQL'en ser selvfølgelig forskellig ud alt efter, hvad brugeren søger på.
Men jeg har lavet et lille eksempel og udskrevet SQL'en!
Avatar billede eagleeye Praktikant
08. juli 2002 - 18:32 #14
Det er rigtigt man kan ikke adskille med ; når det er Access. Ja det vil jeg gerne prøve at se.
Avatar billede oasen Nybegynder
08. juli 2002 - 18:36 #15
Select Count(brugerpicstab.BrugerID), Count(brugerbesoegtab.VaertID), brugerpicstab.BrugerID, profiltab.Brugernavn, profiltab.Alder, profiltab.Koen, profiltab.SidsteLogin From brugerpicstab Left Join profiltab On brugerpicstab.BrugerID = profiltab.BrugerID Where brugerpicstab.Handling = 'V' And profiltab.Brugernavn Like '%Benny%' And profiltab.Alder >= '28' And profiltab.Alder <= '47' And profiltab.Bopael = 'København' And profiltab.Beskrivelse Like '%Blabla%' And profiltab.Koen = 'mand' And (((brugerpicstab.Handling) = 'F')) And (((brugerpicstab.Handling) = 'P')) Order By profiltab.Dato Desc
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC Microsoft Access Driver] You tried to execute a query that does not include the specified expression 'BrugerID' as part of an aggregate function.
Avatar billede oasen Nybegynder
08. juli 2002 - 18:38 #16
Brugeren vælger selv, hvad der skal vises og sorteres/søges efter.
Det er mig selv, der klokker i det, for din virker fint.
Men hvis du kan sige mig hvad der er galt, kan jeg komme et skridt videre.
Jeg synes det begynder at blive lidt uoverskueligt...
Avatar billede oasen Nybegynder
08. juli 2002 - 18:41 #17
Der anmodes om data fra tre tabeller i alt, men nu ligger de i det mindste i den samme DB.
Det burde vel ingen indflydelse have, hvor mange kolonner jeg vælger i min SELECT..
Avatar billede eagleeye Praktikant
08. juli 2002 - 19:02 #18
Hver kolonne som er med i SELECT skal med i GROUP BY:


Select Count(brugerpicstab.BrugerID), Count(brugerbesoegtab.VaertID), brugerpicstab.BrugerID, profiltab.Brugernavn, profiltab.Alder, profiltab.Koen, profiltab.SidsteLogin From brugerpicstab Left Join profiltab On brugerpicstab.BrugerID = profiltab.BrugerID Where brugerpicstab.Handling = 'V' And profiltab.Brugernavn Like '%Benny%' And profiltab.Alder >= '28' And profiltab.Alder <= '47' And profiltab.Bopael = 'København' And profiltab.Beskrivelse Like '%Blabla%' And profiltab.Koen = 'mand' And (((brugerpicstab.Handling) = 'F')) And (((brugerpicstab.Handling) = 'P'))
Group By brugerpicstab.BrugerID, brugerbesoegtab.VaertID, profiltab.Brugernavn, profiltab.Alder, profiltab.Koen, profiltab.SidsteLogin Order By profiltab.Dato Desc


Ligeledes hvordan hænger brugerbesoegtab.VaertID samme med de andte tabeller?
Avatar billede oasen Nybegynder
08. juli 2002 - 19:05 #19
Jeg tror jeg mangler lidt af den grundlæggende viden omkring den måde at lave databaseudtræk på.
Ville du have noget i mod kort at skitsere sammenhængen mellem SELECT, GROUP og ORDER?
Du skal nok få points selvfølgelig...
Avatar billede eagleeye Praktikant
08. juli 2002 - 19:13 #20
SELECT bruges til at vælge kolonner
GROUP BY grupere data i databasen og man skal bruge den når man bruger specielle SQL functioner, eksvis Count(), Sum(), Min(), Max() osv. Count returnere 1 record for som er en optælling af flere records og hvis man så vil havde andre data ud skal man bruge GROUP og så alle de kolonne navne man vil har angivet SELECT.

ORDER BY bruge udelukkene til at bestemme hvordan data skal sorteres, man angiver et kolonne navn og så DESC eller ASC. Man kan angive flere kolonner ved brug af , mellem.

Håber det hjælper lidt..
Avatar billede oasen Nybegynder
08. juli 2002 - 19:17 #21
Ja, mange tak - jeg må selv sidde og rode lidt med det. Det ender jo for det meste med at fungere :)
Avatar billede oasen Nybegynder
08. juli 2002 - 19:26 #22
Hov - så ikke dit spørgsmål.
brugerbesoegtab.VaertID er brugerens ID-numre som i de to andre tabeller. Bare med et andet navn.
Så den skulle måske også sættes lig de andre BrugerID'er!?
Avatar billede eagleeye Praktikant
08. juli 2002 - 19:27 #23
Funtionerne Count() osv. hedder: Aggregate funktioner.

Her er lidt mere forklaring til GROUP BY:
http://www.devguru.com/Technologies/jetsql/quickref/group_by.html
http://www.4guysfromrolla.com/webtech/011202-1.shtml
Avatar billede eagleeye Praktikant
08. juli 2002 - 19:29 #24
Ja men det kommer an på hvad du vil bruge denne: Count(brugerbesoegtab.VaertID)  til ??
Avatar billede oasen Nybegynder
08. juli 2002 - 19:41 #25
Der skal på samme måde som ved brugerpicstab tælles op hvor mange gange VaertID går igen, så der kan sorteres efter dette også.
Avatar billede oasen Nybegynder
09. juli 2002 - 08:51 #26
Og tak for linket..
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