11. marts 2004 - 15:21Der er
17 kommentarer og 3 løsninger
Distinct og top
Jeg arbejder på at få lavet en hjemmeside der kan liste nogle tider opnået til forskellige svømmestævner.
I den forbindelse skal jeg liste de 25 hurtigste tider fra tabellen TTider. Men de tider der bliver valgt må ikke have gengangere i navnene. Og samtidig skal de svømmere der bliver skrevet ud have aktiv = True i tabellen TSvoemmere. Jeg har prøvet med...
sql = "select DISTINCT top " & antal & " TTider.licnr,* from TTider inner join Tsvoemmere ON TTider.licnr = TSvoemmere.licnr where TSvoemmere.aktiv = True AND not TSvoemmere.licnr = ''"
Dette giver mig følgende udskrift når jeg udskriver sql'en: select DISTINCT top 25 TTider.licnr,* from TTider inner join Tsvoemmere ON TTider.licnr = TSvoemmere.licnr where TSvoemmere.aktiv = True AND not TSvoemmere.licnr = '' order by tid asc
Problemet er at siden skriver de 25 hurtigste tider ud, uden at tage hensyn til distinct. Den finder de tider hvor svømmerne er aktive, hvilket virker fint nok.
Dvs. at problemet kun er Distinct. Hvordan løser jeg den ?
select top 25 TTider.licnr,* from TTider inner join Tsvoemmere ON TTider.licnr = TSvoemmere.licnr where TSvoemmere.aktiv = True AND not TSvoemmere.licnr = '' ' and TSvoemmere.licnr in (select top 1 Ttider.Licnr from TTider, Tsvoemmere WHERE TScoemmere.licnr = '"& BrugerID &"' ) order by tid asc
jeg skal desværre benytte alle felterne i databasen...
Men kan jeg lave noget i stilen af...
sql = "select top " & antal & " * from TTider inner join Tsvoemmere ON TTider.licnr = TSvoemmere.licnr where TSvoemmere.aktiv = True AND not TSvoemmere.licnr = ''"
Kædet sammen med: select distinct licnr from ttider
Jeg bliver desværre nødt til at gå nu, kommer tilbage senere.
det må være sådan her..... sql = "select DISTINCT top " & antal & " TTider.licnr,TSvoemmere.* from TTider inner join Tsvoemmere ON TTider.licnr = TSvoemmere.licnr where TSvoemmere.aktiv = True AND not TSvoemmere.licnr = ''"
SQL = "select * from TTider inner join TSvoemmere ON TTider.licnr = TSvoemmere.licnr where TSvoemmere.aktiv = True AND TSvoemmere.licnr is not null AND TTider.licnr in (select distinct top 25 licnr from TTider order by tid) order by TTider.tid"
jeg kan ikke helt huske om man skal bytte rundt på distinct og top 25, det kan komma an på en prøve :)
Sorry dette indlæg men det er ret svært at kontakte en CoAdmin.
EAGLEEYE
Vil du evt se dette http://www.eksperten.dk/spm/475829 og så evt skrive hvad status er så sites brugerer ved hvorfor man ikke har Point ligepludseligt.
Jeg har prøvet alle jeres forslag. Det der kommer tættest, efter hvad jeg kan se ud fra de forskellige svar er Eagels.
Men desværre giver det denne fejl: Microsoft OLE DB Provider for ODBC Drivers (0x80040E07) [Microsoft][ODBC Microsoft Access-driver] ORDER BY-delsætningen (tid) er i konflikt med DISTINCT.
Tror desværre ikke Eagel som sådan kan hjælpe dig med det. Det er nok nærmere admin du skal henvende dig til...
Men mht. spget her..
Jeg har prøvet at ændre lidt i den sql du skrev, men når jeg så udskriver får jeg omkring 940 resultater. Det jeg har ændret er til dette.. sql = "select * from TTider inner join TSvoemmere ON TTider.licnr = TSvoemmere.licnr where TSvoemmere.aktiv = True AND not TSvoemmere.licnr ='' AND TTider.licnr in (select distinct top 25 licnr from TTider) order by TTider.tid"
Prøv sådan her, lille forklaring, med TTider.licnr&TTider.Tid Umiddelbart kan man ikke blande *, distinct og group by som man kunne ønske :) Så man må lave en "kolonne" som består af licnr og tiden som gør en post unik sådan man kan finde den ud af mængden, da et lincr kan optræde flere gange men det kun er den hurtigeste tid som skal med:
sql = "SELECT * FROM TTider LEFT JOIN TSvoemmere ON TTider.licnr = TSvoemmere.licnr WHERE TSvoemmere.aktiv=true AND TTider.licnr&TTider.Tid in (SELECT TOP 25 licnr&Min(TTider.tid) FROM TTider GROUP BY TTider.licnr ORDER BY Min(TTider.tid)) ORDER BY TTider.tid;"
Nu kommer den med resultater, dog kun 15 men det er de 15 hurtigste tider, fra 15 forskellige svømmere. Og man skal have en god tålmodighed før resultatet kommer frem.
Er det fordi access ikke kan håndtere store tabeller (5000 poster) ?
sql-sætningen ser ud som dette når den eksekveres. SELECT * FROM TTider left JOIN TSvoemmere ON TTider.licnr = TSvoemmere.licnr WHERE TSvoemmere.aktiv=true AND not TSvoemmere.licnr = '' and TTider.licnr&TTider.Tid in (SELECT TOP 25 licnr&Min(TTider.tid) FROM TTider GROUP BY TTider.licnr ORDER BY Min(TTider.tid)) ORDER BY TTider.tid;
Jeg bliver nødt til at smutte i seng nu, men glæder mig til at se på det igen i morgen...
sql = "SELECT * FROM TTider LEFT JOIN TSvoemmere ON TTider.licnr = TSvoemmere.licnr WHERE TSvoemmere.aktiv=true AND TTider.licnr&TTider.Tid in (SELECT TOP 25 licnr&Min(TTider.tid) FROM TTider where not TTider.licnr = ''GROUP BY TTider.licnr ORDER BY Min(TTider.tid)) ORDER BY TTider.tid;"
Jeg har prøvet at udbygge sql-sætningen til det her, men det giver stadig kun 16 resultater. Jeg kan ikke forstå hvor de sidste 9 bliver af.
Jeg har løst problemet på en lidt mere krævende måde, da det giver 25 kald til databasen, men derimod er jeg sikker på at jeg får alle 25 gange skrevet ud, og samtidig er det hurtigere end: sql = "SELECT * FROM TTider LEFT JOIN TSvoemmere ON TTider.licnr = TSvoemmere.licnr WHERE TSvoemmere.aktiv=true AND TTider.licnr&TTider.Tid in (SELECT TOP 25 licnr&Min(TTider.tid) FROM TTider where not TTider.licnr = ''GROUP BY TTider.licnr ORDER BY Min(TTider.tid)) ORDER BY TTider.tid;"
min løsning blev følgende: <% set conn = server.createObject("adodb.recordset") set myConn = server.createobject("adodb.connection") myConn.open str 'strengen til databasen. streng = "''" for i = 1 to 25
sql = "select top 1 * from TTider inner JOIN TSvoemmere ON TTider.licnr = TSvoemmere.licnr WHERE TSvoemmere.aktiv=true and TTider.licnr not in (" & streng & ") order by tid asc" conn.open sql, MyConn
udskriver data
conn.close next %>
Men smid et svar hvis i vil have points... ..Ellebæk!
Hmm... det kan nu ellers godt lade sig gøre, men du skal ikke bruge DISTINCT men MAX for at finde den bedste tid for hver svømmer:
SELECT TOP 25 TSvoemmere.licnr, [...andre felter...], Max(TTider.tid) AS MaxOftid FROM TTider INNER JOIN TSvoemmere ON TTider.licnr = TSvoemmere.licnr GROUP BY TSvoemmere.licnr, [...andre felter...], TSvoemmere.aktiv HAVING (((TSvoemmere.licnr)<> '') AND ((TSvoemmere.aktiv)=True)) ORDER BY Max(TTider.tid)
Jeg har ikke prøvet dit forslag, jeg blev enig med mig selv om at jeg holdt mig til det med flere forskellige sqler og så valgte at benytte IN i sql'erne.
Men du får lidt points også ;-) Jeg lukker i morgen.
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.