Avatar billede ellebaek Nybegynder
11. marts 2004 - 15:21 Der 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 ?

På forhånd tak.
Avatar billede fennec Nybegynder
11. marts 2004 - 15:27 #1
distinct bruges på alle valgte kolonner, så problemet er i " TTider.licnr,* ". Prøv kun at selecte de felter du skal bruge....
Avatar billede kelo Nybegynder
11. marts 2004 - 15:30 #2
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
Avatar billede ellebaek Nybegynder
11. marts 2004 - 15:30 #3
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.
Avatar billede kelo Nybegynder
11. marts 2004 - 15:30 #4
Jeg tror det giver det rigtige resultat.
Avatar billede fennec Nybegynder
11. marts 2004 - 15:32 #5
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 = ''"
Avatar billede eagleeye Praktikant
11. marts 2004 - 17:04 #6
Sådan her:

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 :)
Avatar billede want2learn Nybegynder
11. marts 2004 - 18:51 #7
ELLEBAEK

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.
Avatar billede ellebaek Nybegynder
11. marts 2004 - 18:52 #8
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.
Avatar billede ellebaek Nybegynder
11. marts 2004 - 18:58 #9
Want2Learn...

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"
Avatar billede eagleeye Praktikant
11. marts 2004 - 23:45 #10
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;"
Avatar billede ellebaek Nybegynder
12. marts 2004 - 00:16 #11
Hej eagel...

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...
Avatar billede ellebaek Nybegynder
13. marts 2004 - 11:26 #12
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.
Avatar billede ellebaek Nybegynder
14. marts 2004 - 21:03 #13
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
Avatar billede ellebaek Nybegynder
14. marts 2004 - 21:04 #14
og resten af koden:

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!
Avatar billede kimovitch Nybegynder
15. marts 2004 - 01:11 #15
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)

Med venlig hilsen
Kim
Avatar billede ellebaek Nybegynder
17. marts 2004 - 19:28 #16
Slet ingen der vil have points ?
Avatar billede eagleeye Praktikant
17. marts 2004 - 21:12 #17
Ok, et svar så kan du dele dem som du har mener er rigtigt :)
Avatar billede kimovitch Nybegynder
17. marts 2004 - 22:39 #18
Har du prøvet mit forslag med MAX? Jeg har testet det, og den er god nok... :)
Avatar billede ellebaek Nybegynder
17. marts 2004 - 22:41 #19
Hej Kim...

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.
Avatar billede ellebaek Nybegynder
18. marts 2004 - 21:11 #20
Tak for hjælpen alle sammen ;-)
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