08. juli 2002 - 11:10Der 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?
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
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;
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.
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 ..... ... ...;
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?
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)?
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!
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.
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...
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..
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?
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...
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.
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!?
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.