[mySQL] Laatste X records behouden

Pagina: 1
Acties:

  • WhiteDog
  • Registratie: Juni 2001
  • Laatst online: 31-01 21:14

WhiteDog

met zwarte hond

Topicstarter
Ik ben een beetje op zoek naar de simpelste manier om de laatste X records te behouden en alle andere te deleten. Het leek me het mooist om even volgende query te draaien:

SQL:
1
2
delete from isp_users_speedtest where userid=1 and testtime not in (
select testtime from isp_users_speedtest where userid=1 order by testtime desc limit 0,10)


Alleen krijg ik dan volgende error:
Error Code : 1235
This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
(31 ms taken)

trouwens wel grappig dat een programma weet dat het bepaalde dingen wél kan in een nieuwere versie :P

De enige andere manier die ik bedenken is:
1. laatste 10 records nemen
2. kijken of er wel 10 zijn
3. testtime uitlezen van 10e record
4. deleten van alles < testtime van 10e record

dit zou neerkomen op 2 queries en een loop. Kan dit echt niet simpeler :?

[ Voor 12% gewijzigd door WhiteDog op 16-06-2006 19:19 ]


  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Eerst 10 resultaten ophalen en in een array returnen, dan even imploden en kan je mooi in die NOT IN () gebruiken. MySQL ondersteunt idd geen LIMIT in subquery's en verwacht ook altijd 1 resultaat in een subquery (voor zover ik weet).

March of the Eagles


  • martennis
  • Registratie: Juli 2005
  • Laatst online: 16-01 14:17
niet wanneer je een IN gebruikt... maar dat van LIMIT klopt wel, dat pakt ie niet

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09-2025

djc

(jarig!)
Volgens deze pagina kan je je DELETE FROM ook direct een ORDER BY en LIMIT clause meegeven...

Rustacean


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 19-02 20:17

Robtimus

me Robtimus no like you

WhiteDog schreef op vrijdag 16 juni 2006 @ 19:15:
De enige andere manier die ik bedenken is:
1. laatste 10 records nemen
2. kijken of er wel 10 zijn
3. testtime uitlezen van 10e record
4. deleten van alles < testtime van 10e record

dit zou neerkomen op 2 queries en een loop. Kan dit echt niet simpeler :?
Waarom een loop?
SQL:
1
SELECT testtime FROM isp_users_speedtest WHERE userid = 1 ORDER BY testtime DESC LIMIT 9,1
Als je 10 of meer records hebt dan levert dit de nummer 10 van de nieuwste records. Als er minder records zijn levert het een empty resultset op.
Daarna is het eenvoudig:
SQL:
1
DELETE FROM isp_users_speedtest WHERE userid = 1 AND testtime < X
waarbij X je net opgehaalde test tijd is.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • WhiteDog
  • Registratie: Juni 2001
  • Laatst online: 31-01 21:14

WhiteDog

met zwarte hond

Topicstarter
Manuzhai schreef op vrijdag 16 juni 2006 @ 21:17:
Volgens deze pagina kan je je DELETE FROM ook direct een ORDER BY en LIMIT clause meegeven...
Dat klopt, maar ik gebruik de LIMIT en ORDER BY om dingen uit te sluiten van men delete.

  • WhiteDog
  • Registratie: Juni 2001
  • Laatst online: 31-01 21:14

WhiteDog

met zwarte hond

Topicstarter
IceManX schreef op vrijdag 16 juni 2006 @ 22:04:
[...]
Waarom een loop?
SQL:
1
SELECT testtime FROM isp_users_speedtest WHERE userid = 1 ORDER BY testtime DESC LIMIT 9,1
Als je 10 of meer records hebt dan levert dit de nummer 10 van de nieuwste records. Als er minder records zijn levert het een empty resultset op.
Daarna is het eenvoudig:
SQL:
1
DELETE FROM isp_users_speedtest WHERE userid = 1 AND testtime < X
waarbij X je net opgehaalde test tijd is.
Mijn dank is groot :) Was een beetje vergeten dat je kon beginnen bij een bepaald record...
Pagina: 1