Avatar billede lund_dk Praktikant
19. januar 2008 - 21:40 Der er 17 kommentarer og
1 løsning

SQL fejl, men hvor

Conn.Execute("DELETE FROM profilbesog WHERE Id NOT IN(SELECT TOP 50 Id FROM profilbesog where brugerid = " & rs("id") & " ORDER BY Dato DESC) and brugerid = " & rs("id") & "")

Jeg får denne fejl:

[MySQL][ODBC 3.51 Driver][mysqld-5.0.19-nt-max]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '50 * Id FROM profilbesog where brugerid = 513 ORDER BY Dato DESC) and brugerid =' at line 1

Hvad er fejlen mon?

Jeg skal ind og slette alle gamle, hvis der er over 50 poster
Avatar billede w13 Novice
19. januar 2008 - 21:43 #1
Hvad hvis du afslutter med:
brugerid = " & rs("id"))
Avatar billede lund_dk Praktikant
19. januar 2008 - 21:46 #2
samme fejl

[MySQL][ODBC 3.51 Driver][mysqld-5.0.19-nt-max]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '50 Id FROM profilbesog where brugerid = 513 ORDER BY Dato DESC) and brugerid = 5' at line 1
Avatar billede nielle Nybegynder
19. januar 2008 - 21:58 #3
MySQL bruger ikke TOP. I stedet skal du bruge LIMIT.

Conn.Execute("DELETE FROM profilbesog WHERE Id NOT IN(SELECT Id FROM profilbesog where brugerid = " & rs("id") & " ORDER BY Dato DESC LIMIT 0, 50) and brugerid = " & rs("id") & " ")
Avatar billede lund_dk Praktikant
19. januar 2008 - 22:01 #4
nårh ja for fanden.. DOH..

Smid et svar for det :D
Avatar billede nielle Nybegynder
19. januar 2008 - 22:02 #5
Eller i den lidt kortere version:

Conn.Execute("DELETE FROM profilbesog WHERE Id NOT IN (SELECT Id FROM profilbesog WHERE brugerid = " & rs("id") & " ORDER BY Dato DESC LIMIT 50) AND brugerid = " & rs("id"))
Avatar billede lund_dk Praktikant
19. januar 2008 - 22:02 #6
hmm, der får jeg fejlen..

[MySQL][ODBC 3.51 Driver][mysqld-5.0.19-nt-max]This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
Avatar billede lund_dk Praktikant
19. januar 2008 - 22:04 #7
jeg bruger LIMIT alle mulige andre steder uden problemer?
Avatar billede nielle Nybegynder
19. januar 2008 - 22:06 #8
Åbenbart vil den ikke acceptere LIMIT i en subquery - og det er det derbruges i netop dette tilfælde.
Avatar billede lund_dk Praktikant
19. januar 2008 - 22:19 #9
Hvad kan jeg så gøre, for at slette alle poster, med undtagelse af de 50 nyeste?
Avatar billede nielle Nybegynder
19. januar 2008 - 22:31 #10
Du må vel gøre det af to omgange - først udtrække de 50 poster og sætte dem sammen til en streng som du så kan sætte ind i IN-leddet og så delete dem der ikke er der i anden omgang.
Avatar billede lund_dk Praktikant
19. januar 2008 - 23:24 #11
Kan du hjælpe mig en smule på vej med det?
Avatar billede nielle Nybegynder
20. januar 2008 - 09:40 #12
sql1 = "SELECT Id FROM profilbesog WHERE brugerid = " & rs("id") & " ORDER BY Dato DESC LIMIT 50"
Set rs = Conn.Execute(sql1)

inLeddet = ""
Do While Not rs.EOF
    If inLeddet <> "" Then inLeddet = inLeddet & ","
    inLeddet = inLeddet & rs("id")

    rs.MoveNext
Loop

sql2 = "DELETE FROM profilbesog WHERE Id NOT IN (" & inLeddet & ") AND brugerid = " & rs("id")
Conn.Execute(sql2)
Avatar billede nielle Nybegynder
29. januar 2008 - 16:40 #13
Har du fået kiget på det?
Avatar billede michael_stim Ekspert
29. januar 2008 - 16:44 #14
Det kunne måske klares med en JOIN?
Avatar billede lund_dk Praktikant
03. februar 2008 - 13:17 #15
nielle: nope, kan ikke få det til at virke, får en fejlkode på linien
sql2 = "DELETE FROM profilbesog WHERE Id NOT IN (" & inLeddet & ") AND brugerid = " & rs("id")

men den uddyber ikke fejlen.
Avatar billede nielle Nybegynder
03. februar 2008 - 19:37 #16
Det er nok heller ikke så smart at bruge den samme rs til begge lops:

sql1 = "SELECT Id FROM profilbesog WHERE brugerid = " & rs("id") & " ORDER BY Dato DESC LIMIT 50"
Set rsInner = Conn.Execute(sql1)

inLeddet = ""
Do While Not rsInner.EOF
    If inLeddet <> "" Then inLeddet = inLeddet & ","
    inLeddet = inLeddet & rsInner("id")

    rsInner.MoveNext
Loop

sql2 = "DELETE FROM profilbesog WHERE Id NOT IN (" & inLeddet & ") AND brugerid = " & rs("id")
Conn.Execute(sql2)
Avatar billede nielle Nybegynder
11. februar 2008 - 18:21 #17
Har du fået det til at virke?
Avatar billede nielle Nybegynder
18. februar 2008 - 18:19 #18
??
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