Avatar billede ossian Nybegynder
24. marts 2005 - 13:32 Der er 13 kommentarer og
1 løsning

ASP/MySQL - Problem med random udtræk

Hej,

Jeg har en problemstilling som jeg ikke umiddelbart kan se løsningen på..Jeg er sikker på at den er der - Jeg skal bare bruge lidt hjælp fra jer..

Info om funktionen:
Der skal udvælges en random url i en tabel.. Tabellen hedder "trades" og det felt der skal udvælges hedder returnurl.. Dette klares med:

SQL1:SELECT * FROM trades ORDER BY RAND() - Brugeren redirectes så til returnurl

Dog har jeg også en tabel der holder styr på hvilke returnurl's brugeren allerede har set - Den hedder "out" og de relevante felter her hedder visitorid og returnurl..

SQL2: SELECT * FROM out WHERE visitorid = '" & strVisitorID & "' AND returnurl = '" & strReturnURL & "'

Det jeg ønsker er at brugeren aldrig sendes til den samme returnurl 2 gange.. Så jeg forestiller mig at den første SQL skal køres igen og igen indtil SQL2 ikke kan finde en post.. Hvordan gør jeg det??

Jeg vil også meget gerne have at såfremt der ikke eksisterer returnurls i SQL1 som brugeren allerede har set, så får brugeren den besked at alle returnurl's er vist..

På forhånd tak! Og spørg endelig hvis der er noget i er i tvivl om..
Avatar billede eagleeye Praktikant
24. marts 2005 - 16:41 #1
Prøv noget i stil med:

sql = "select trades.* from trades where returnurl not in (select returnurl from out where visitorid = '" & strVisitorID & "') order by rand()"
Set rs = Conn.Execute(sql)
if not rs.EOF then
  'redirtect
else
  Response.write "Ikke flere return urls"
end if
Avatar billede eagleeye Praktikant
24. marts 2005 - 16:47 #2
Nu skriver du mySQL og i ældre versioner af mySQL er IN ikke med så kan man skrive SQL sætningen om:

sql = "select trades.* from trades left join out on trades.returnurl = out.returnurl where out.returnurl is null AND out.visitorid = '" & strVisitorID & "' order by rand()"
Avatar billede ossian Nybegynder
24. marts 2005 - 17:23 #3
Tak :-) Jeg tror lige det er en sidste der skal til.. da min udbyder kører en 4.0.20a-nt version..  Jeg tester om lidt :)
Avatar billede ossian Nybegynder
24. marts 2005 - 18:27 #4
Hmm, Jeg får :

"Ikke flere return urls" selvom jeg har slettet alle poster i OUT..
Avatar billede ossian Nybegynder
24. marts 2005 - 18:32 #5
Du får lige hele min kode her - det skal siges at out.trader indeholder samme værdi som trades.returnurl:


Set TradeURL = Conn.Execute("select trades.* from trades left join out on trades.returnurl = out.trader where out.trader is null AND out.visitorid = '" & visitorid & "' order by rand()")
if NOT TradeURL.EOF then

'set TradeURL = Conn.Execute("SELECT * FROM trades WHERE status = 'accepted' AND (hitsin * 2) > hitsout ORDER BY RAND()")

strTradeURL = TradeURL("tradeurl")

StrHitsOut = TradeURL("hitsout")
strHitsOut = strHitsOut + int(1)


strHitSQL = "UPDATE trades SET hitsout = '" & strHitsOut & "' WHERE tradeurl = '" & strTradeURL & "'"
Conn.Execute strHitSQL

if outCount > int(10) then
outcount = int(0)
end if

strTradeURL = TradeURL("returnurl")
strSQL = "INSERT INTO out (trader,created,count,visitorid) VALUES ("
            strSQL = strSQL & "'" & strTradeURL & "',"
            strSQL = strSQL & "now(),"
            strSQL = strSQL & "'" & outcount & "',"
            strSQL = strSQL & "'" & visitorid & "');"
              Conn.Execute strSQL


response.Redirect strTradeURL
else
  Response.write "Ikke flere return urls"
end if
Avatar billede eagleeye Praktikant
24. marts 2005 - 18:46 #6
Ok den tager ikke nogle fordi den vil havde visitorid=XZ så prøv at skrive den sådan her så visitorid også kan være lig null.

Set TradeURL = Conn.Execute("select trades.* from trades left join out on trades.returnurl = out.trader where out.trader is null AND (out.visitorid = '" & visitorid & "' or out.visitorid is null) order by rand()")
Avatar billede ossian Nybegynder
24. marts 2005 - 18:51 #7
Genialt!!!

Du skal have tusinde tak for hjælpen!! Jeg har kæmpet med det her problem i dagevis, men kan sagtens se logikken i den nye SQL..

Tak!
Avatar billede ossian Nybegynder
24. marts 2005 - 18:51 #8
Smid et svar..
Avatar billede eagleeye Praktikant
24. marts 2005 - 19:03 #9
ok, her er et svar ;)
Avatar billede ossian Nybegynder
24. marts 2005 - 21:56 #10
Eagleeye>

Jeg glemte en detalje jeg troede jeg selv kunne klare :-) Håber at du vil hjælpe mig med den.. Giver gerne 100p for det..

SQL'en ser sådan ud:
Set TradeURL = Conn.Execute("select trades.* from trades left join out on trades.returnurl = out.trader where out.trader is null AND (out.visitorid = '" & visitorid & "' or out.visitorid is null) order by rand()")

Dog vil jeg gerne have følge betingelser med også:
trades.status = 'accepted' AND (trades.hitsin * 2) > trades.hitsout - Spørgsmålet er bare hvor i sætningen det skal ind for at fungere..

trades.hitsin og trades.hitsout er to talfelter der holder styr på hvor mange hits jeg har modtaget..
Avatar billede eagleeye Praktikant
24. marts 2005 - 22:00 #11
Når det er i trades tabellen bør det kunne sættes ind sådan her:

Set TradeURL = Conn.Execute("select trades.* from trades left join out on trades.returnurl = out.trader where out.trader is null AND (out.visitorid = '" & visitorid & "' or out.visitorid is null) and trades.status = 'accepted' AND (trades.hitsin * 2) > trades.hitsout order by rand()")
Avatar billede ossian Nybegynder
24. marts 2005 - 22:15 #12
Avatar billede eagleeye Praktikant
24. marts 2005 - 22:22 #13
Jeg glemte at skrive at det ikke var nødvendigt med ekstra point :)
Det er så heller ikke tilladt at give mere end 100 point for et spørgsmål ifølge reglerne :)
Avatar billede ossian Nybegynder
24. marts 2005 - 22:27 #14
Ok - Jamen tak for hjælpen under alle omstændigheder...
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