Skrevet søn. d. 12. august 2007 kl. 07:47:41| #1
Bare til en anden gang: Dette spørgsmåål hører egentlig mere hjemme under en af Ekspertens database-kategorier.
Men prøv denne:
Set rs = Conn.Execute("
SELECT TOP 5 *, answerscorrect / (games * 10) AS rating
FROM user
WHERE games => 250
ORDER BY rating DESC
")
Skrevet søn. d. 12. august 2007 kl. 09:47:59| #2
Okay, vil jeg prøve at huske.
Jeg prøver at køre koden, men jeg får blot "Siden kan ikke vises". Har ellers slået til sådan at den skal fejlmelde, men ved ikke hvorfor den ikke gør.
ser det her forkert ud?
<%
Set conn = Server.CreateObject("ADODB.Connection")
Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("database.mdb")
Set rs = Conn.Execute("
SELECT TOP 2 *, answerscorrect / (games * 10) AS rating
FROM user
WHERE games => 250
ORDER BY rating DESC
")
%>
<% do while not rs.eof %>
<% = rs("games") %><br>
<%
rs.movenext
loop
%>
Jeg skal lige minde om, at games kan være 0, det vil sige at man egentlig kan komme til at devidere med nul, hvilket jo matematisk set ikke er muligt.
Men har jeg gjort noget forkert ovenfor?
Skrevet søn. d. 12. august 2007 kl. 10:00:19| #3
VB Script er ikke vild med at man deler over flere linjer på netop den måde. Det var bare min måde at vise de forskellige komponenter af SQL'en. Den skal se sådan ud i din kode:
<%
Set conn = Server.CreateObject("ADODB.Connection")
Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("database.mdb")
Set rs = Conn.Execute("SELECT TOP 2 *, answerscorrect / (games * 10) AS rating FROM user WHERE games => 250 ORDER BY rating DESC")%>
Skrevet søn. d. 12. august 2007 kl. 10:06:25| #4
Får irriterende nok stadigvæk "Siden kan ikke vises med:
<%
Set conn = Server.CreateObject("ADODB.Connection")
Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("database.mdb")
Set rs = Conn.Execute("SELECT TOP 2 *, answerscorrect / (games * 10) AS rating FROM user WHERE games => 250 ORDER BY rating") %>
<% do while not rs.eof %>
<% = rs("games") %><br>
<%
rs.movenext
loop
%>
:/
Skrevet søn. d. 12. august 2007 kl. 10:38:59| #5
Prøv at starte Access op direkte og så afprøv SQL'en i den:
SELECT TOP 2 *, answerscorrect / (games * 10) AS rating FROM user WHERE games => 250 ORDER BY rating
Det kan godt tænkes at Accesse ikke er vild med syntaksen, selv om andre database-typer acceptere det...
Skrevet søn. d. 12. august 2007 kl. 10:44:01| #6
Hehe, nu er jeg ikke lige en haj til det med forskellige databaser åbninger, kan du ikke hjælpe mig lidt? ;)
Skrevet søn. d. 12. august 2007 kl. 11:05:48| #7
Du skal starte Acces på din egen maskine, og så åbner di mdb-filen fra denne. Dette kræver selvfølgelig at diu har filen liggende lokalt.
Skrevet søn. d. 12. august 2007 kl. 11:12:29| #8
Ehm, jeg forstår ikke helt... Hvad er formålet med det? Og hvordan kan jeg afprøve SQL'en direkte?
Skrevet søn. d. 12. august 2007 kl. 11:30:50| #9
Formålet er netop at afprøve SQL-koden uden at den er viklet ind i en helt masse ASP-kode. På den måde kan man isolere hvor det er at fejlen opstår henne: Er det i ASP-koden eller i SQL-koden?
For at afprøve en SQL-sætning i Access skal du vist oprette en Forespørgsel. Derefter er der et eller andet sted, hvor at du kan skifte til at se denne som SQL. I det vindue kan du indtaste din SQL fra ovenfor og så køre den.
Skrevet søn. d. 12. august 2007 kl. 11:34:31| #10
Det er vist nok kompliceret nogen derinde under forespørgelser :P Jeg kan ikke lige se et felt hvor jeg skal skrive det...
Skrevet søn. d. 12. august 2007 kl. 11:40:22| #11
Ok, har prøvet mig lidt frem, og den kan fint finde nogle felter med:
SELECT TOP 2 *, answerscorrect / (games * 10) AS rating FROM user WHERE games > 250 ORDER BY rating
men denne duer ikke:
SELECT TOP 2 *, answerscorrect / (games * 10) AS rating FROM user WHERE games => 250 ORDER BY rating
Kan det være => der er noget galt med?
Skrevet søn. d. 12. august 2007 kl. 11:43:08| #12
Arh, det var der problemet var ;)
Men hvordan kan jeg løse problemet med, at jeg kan komme til at dividere med 0?
Skrevet søn. d. 12. august 2007 kl. 11:54:24| #13
Skrevet søn. d. 12. august 2007 kl. 11:55:25| #14
Division med 0 er vel ikke noget problem. De skal vel ikke være med i top-5 alligevel.
Skrevet søn. d. 12. august 2007 kl. 12:51:51| #15
Har du nok ret i.
Jeg tænkte på, om man kan lave noget om i denne her, så det kommer til at fungere?
Set rs = Conn.Execute("select * from user order by DateDiff("n",now,"lastactive") > -10 ")
hvor lastactive er format dd-mm-yyyy hh-mm-ss
Jeg doubler lige op med point, hvis du kan hjælpe mig.
Skrevet søn. d. 12. august 2007 kl. 12:53:35| #16
Den skal egentlig 'bare' være:
Set rs = Conn.Execute("select * from user order by DateDiff("n",now,"lastactive") ")
Skrevet søn. d. 12. august 2007 kl. 17:14:06| #17
Så er det vel nok med:
Set rs = Conn.Execute("SELECT * FROM user ORDER BY lastactive")
Skrevet søn. d. 12. august 2007 kl. 17:16:18| #18
Ja, så det skal være
Set rs = Conn.Execute("select * from user order by DateDiff("n",now,"lastactive") > -10 ")
Skrevet søn. d. 12. august 2007 kl. 20:15:07| #19
Så er det nok ikke ORDER BY du leder efter, men derimod WHERE:
Set rs = Conn.Execute("SELECT * FROM user WHERE DateDiff('n', Now(), lastactive) > 10")
Skrevet søn. d. 12. august 2007 kl. 21:41:02| #20
Takker...
Jeg tænkte på...
Set rs = Conn.Execute("SELECT TOP 10 *, answerscorrect / (games * 10) AS rating FROM user WHERE games > 100 ORDER BY rating")
Kan man ikke kalde den noget andet end "rating" - det er nemligt lidt uheldigt, da jeg i forvejen har et felt der hedder rating... Det ser ud som om at den sortere efter den i stedet for answerscorrect / (games * 10)
Og post lige et svar...
Skrevet søn. d. 12. august 2007 kl. 22:00:09| #21
Jo da - "AS rating" definere bare at "rating" er et alias for værdien af "answerscorrect / (games * 10)". Rating var blot mit bud på et passende alias-navn, og du kan sagtens vælge noget helt andet hvis du vil.
... og et svar
Skrevet man. d. 13. august 2007 kl. 06:54:01| #22
Og dog... jeg får en fejl ved at kalde den ffffffs, og har også prøvet andet som ikke virker.
Den melder:
Microsoft OLE DB Provider for ODBC Drivers error '80040e10'
[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1.
statistic.asp, line 86
Skrevet man. d. 13. august 2007 kl. 06:57:50| #23
... Ved følgende kode:
Set rs = Conn.Execute("SELECT TOP 10 *, answerscorrect / (games * 10) AS ffffffs FROM user WHERE games > 100 ORDER BY ffffffs") %>
Skrevet man. d. 13. august 2007 kl. 07:38:40| #24
Hvad sker der hvis du afprøver den der direkte i Access?
Skrevet man. d. 13. august 2007 kl. 15:17:27| #25
Den skriver:
Der er en ugyldig SQL-sætning. "DELETE", "INSERT", "PROCEDURE", "SELECT" eller "UPDATE" var ventet.
Skrevet man. d. 13. august 2007 kl. 15:22:52| #26
Hov, det var en fejl... Der kommer sådan en boks op, hvor der står: "Indtast parameterværdi"...
Skrevet tir. d. 14. august 2007 kl. 07:15:53| #27
Hmm, ikke så godt. Hvad sker der hvis du indtaster et tal i den?
Skrevet tir. d. 14. august 2007 kl. 14:22:18| #28
Så laver den en ny kollonne ved navn ffffffs og regner så ud det den skal... 0,421311475409836, 0,955238095238095 osv...
Skrevet ons. d. 15. august 2007 kl. 09:13:44| #29
Det er netop derfor at det kan være en god ide at afprøve SQL'en uafhængigt af resten af ASP koden...
Prøv med denne SQL (desværre har jeg ikke selv lige Access ved hånden, og kan derfor ikke afprøve den):
SELECT TOP 10 *
FROM
(
SELECT *, answerscorrect / (games * 10) AS ffffffs
FROM user
WHERE games > 100
)
ORDER BY ffffffs DESC
Skrevet ons. d. 15. august 2007 kl. 09:20:47| #30
Den ser ud til at virke, den gør i hvert det den skal når jeg kører den i access.
Skrevet ons. d. 15. august 2007 kl. 09:32:09| #31
Set rs = Conn.Execute("SELECT TOP 10 * FROM (SELECT *, answerscorrect / (games * 10) AS ffffffs FROM user WHERE games > 100 ) ORDER BY ffffffs DESC ")
Det virker :D
Tak for hjælpen.
Skrevet ons. d. 15. august 2007 kl. 14:31:39| #32