Avatar billede flodhesten Nybegynder
12. august 2007 - 00:54 Der er 31 kommentarer og
1 løsning

Lidt problemer med databaseudtræk.

Hej eksperter.

Hehe, kan man på nogen måde gøre det her?

Set rs = Conn.Execute("select top 5 * from user where games => 250 order by answerscorrect / (games * 10) desc")

Jeg er udemærket godt klar over, at ovenstående ikke virker, men kan man lave sådan, at princippet vil virke? Kan lige sige at både answerscorrect og games er tal-værdier.

På forhånd tak.
Avatar billede nielle Nybegynder
12. august 2007 - 07:47 #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
")
Avatar billede flodhesten Nybegynder
12. august 2007 - 09:47 #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?
Avatar billede nielle Nybegynder
12. august 2007 - 10:00 #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")%>
Avatar billede flodhesten Nybegynder
12. august 2007 - 10:06 #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
%>

:/
Avatar billede nielle Nybegynder
12. august 2007 - 10:38 #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...
Avatar billede flodhesten Nybegynder
12. august 2007 - 10:44 #6
Hehe, nu er jeg ikke lige en haj til det med forskellige databaser åbninger, kan du ikke hjælpe mig lidt? ;)
Avatar billede nielle Nybegynder
12. august 2007 - 11:05 #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.
Avatar billede flodhesten Nybegynder
12. august 2007 - 11:12 #8
Ehm, jeg forstår ikke helt... Hvad er formålet med det? Og hvordan kan jeg afprøve SQL'en direkte?
Avatar billede nielle Nybegynder
12. august 2007 - 11:30 #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.
Avatar billede flodhesten Nybegynder
12. august 2007 - 11:34 #10
Det er vist nok kompliceret nogen derinde under forespørgelser :P Jeg kan ikke lige se et felt hvor jeg skal skrive det...
Avatar billede flodhesten Nybegynder
12. august 2007 - 11:40 #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?
Avatar billede flodhesten Nybegynder
12. august 2007 - 11:43 #12
Arh, det var der problemet var ;)

Men hvordan kan jeg løse problemet med, at jeg kan komme til at dividere med 0?
Avatar billede nielle Nybegynder
12. august 2007 - 11:54 #13
Det skal være >= ikke =>
Avatar billede nielle Nybegynder
12. august 2007 - 11:55 #14
Division med 0 er vel ikke noget problem. De skal vel ikke være med i top-5 alligevel.
Avatar billede flodhesten Nybegynder
12. august 2007 - 12: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.
Avatar billede flodhesten Nybegynder
12. august 2007 - 12:53 #16
Den skal egentlig 'bare' være:

Set rs = Conn.Execute("select * from user order by DateDiff("n",now,"lastactive") ")
Avatar billede nielle Nybegynder
12. august 2007 - 17:14 #17
Så er det vel nok med:

Set rs = Conn.Execute("SELECT * FROM user ORDER BY lastactive")
Avatar billede flodhesten Nybegynder
12. august 2007 - 17:16 #18
Ja, så det skal være
Set rs = Conn.Execute("select * from user order by DateDiff("n",now,"lastactive") > -10 ")
Avatar billede nielle Nybegynder
12. august 2007 - 20:15 #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")
Avatar billede flodhesten Nybegynder
12. august 2007 - 21:41 #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...
Avatar billede nielle Nybegynder
12. august 2007 - 22:00 #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
Avatar billede flodhesten Nybegynder
13. august 2007 - 06:54 #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
Avatar billede flodhesten Nybegynder
13. august 2007 - 06:57 #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") %>
Avatar billede nielle Nybegynder
13. august 2007 - 07:38 #24
Hvad sker der hvis du afprøver den der direkte i Access?
Avatar billede flodhesten Nybegynder
13. august 2007 - 15:17 #25
Den skriver:

Der er en ugyldig SQL-sætning. "DELETE", "INSERT", "PROCEDURE", "SELECT" eller "UPDATE" var ventet.
Avatar billede flodhesten Nybegynder
13. august 2007 - 15:22 #26
Hov, det var en fejl... Der kommer sådan en boks op, hvor der står: "Indtast parameterværdi"...
Avatar billede nielle Nybegynder
14. august 2007 - 07:15 #27
Hmm, ikke så godt. Hvad sker der hvis du indtaster et tal i den?
Avatar billede flodhesten Nybegynder
14. august 2007 - 14:22 #28
Så laver den en ny kollonne ved navn ffffffs og regner så ud det den skal... 0,421311475409836, 0,955238095238095 osv...
Avatar billede nielle Nybegynder
15. august 2007 - 09:13 #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
Avatar billede flodhesten Nybegynder
15. august 2007 - 09:20 #30
Den ser ud til at virke, den gør i hvert det den skal når jeg kører den i access.
Avatar billede flodhesten Nybegynder
15. august 2007 - 09:32 #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.
Avatar billede nielle Nybegynder
15. august 2007 - 14:31 #32
Selv tak for point :^)
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