Avatar billede cmau Nybegynder
09. november 2005 - 16:08 Der er 21 kommentarer og
1 løsning

vise 50 nyeste og slet alle andre udover dem

Hejsa

Jeg henter fra min database sådan her:

$query = mysql_query("SELECT * FROM noticeboard ORDER BY id DESC LIMIT 50") or die(mysql_error());

Hvordan kan jeg så gøre, så alle dem som ikke er blandt de 50 meste bliver slettet?
Avatar billede jakobdo Ekspert
09. november 2005 - 16:15 #1
Så skal du have fat i det id som lige ligger som nummer 51!
Og så kan du bruge: DELETE FROM noticeboard WHERE id < DITID
Avatar billede cmau Nybegynder
09. november 2005 - 16:19 #2
Jamen, hvordan finder jeg den der er 51. nyeste?
Avatar billede jakobdo Ekspert
09. november 2005 - 16:20 #3
Det er jo det svære! :o)
Du kunne lave SELECT * FROM noticeboard ORDER BY id DESC LIMIT 51
Den sidste eller første række vil indeholde det sidste id, så sletter vi alt som er ældre!
Avatar billede cmau Nybegynder
09. november 2005 - 16:26 #4
hmm kan ikke lige se hvordan jeg skal gøre det.. :S..
Avatar billede nielle Nybegynder
09. november 2005 - 17:10 #5
DELETE FROM noticeboard WHERE id NOT IN (SELECT id FROM noticeboard ORDER BY id DESC LIMIT 50)
Avatar billede cmau Nybegynder
09. november 2005 - 17:11 #6
skal jeg bare gære sådan her så :O

mysql_query("DELETE FROM noticeboard WHERE id NOT IN (SELECT id FROM noticeboard ORDER BY id DESC LIMIT 50)") or die(mysql_error());
Avatar billede nielle Nybegynder
09. november 2005 - 17:15 #7
Det afhænger af om din MySQL er ny nok til at kunne håndtere subselects, men, ja, ellers burde det virke.
Avatar billede cmau Nybegynder
09. november 2005 - 17:48 #8
Lader ikke til at den gør:
This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
Avatar billede cmau Nybegynder
09. november 2005 - 18:03 #9
Hvad kan jeg så gøre?
Avatar billede nielle Nybegynder
09. november 2005 - 18:15 #10
Så må du enten gøre som jakobdo foreslår...

...eller du kan gennemføre den indre SELECT:

SELECT id FROM noticeboard ORDER BY id DESC LIMIT 50

- hvorved du får en liste af id'er som ikke skal slettes. Denne liste kan du så efterfølgende bruge i en SQL som denne:

DELETE FROM noticeboard WHERE id NOT IN (id1,id2,id3,id4, osv., id49,id50)
Avatar billede cmau Nybegynder
09. november 2005 - 18:24 #11
JAmen IN er ikke understøttet!
Avatar billede jakobdo Ekspert
09. november 2005 - 18:31 #12
Prøv lige at lav en sql i din phpmyadmin, som er: SELECT VERSION();
Og skriv hvad du får som output.
Avatar billede cmau Nybegynder
09. november 2005 - 18:41 #13
Bare sådan her?
VERSION() 
4.1.9-max
Avatar billede nielle Nybegynder
09. november 2005 - 18:57 #14
Hvad mener du med at IN ikke er understøttet? Det var den specielle måde at bruge LIMIT på at du fik en fejlmedelelse - ikke IN.
Avatar billede cmau Nybegynder
09. november 2005 - 20:55 #15
Den skriver jo:
This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

Men hvordan skal jeg få alle id her ind (id1,id2,id3,id4, osv., id49,id50) ??
Avatar billede jakobdo Ekspert
09. november 2005 - 21:01 #16
Du kan lave:
$query = mysql_query("SELECT id FROM noticeboard ORDER BY id DESC LIMIT 50") or die(mysql_error());
if(mysql_num_rows($query)>0)
{
$tempArray = array();
while($row = mysql_fetch_assoc($query))
{
$tempArray[] = $row["id"];
}
$query = mysql_query("DELETE FROM noticeboard WHERE id IN (".implode(",",$tempArray).")") or die(mysql_error());
}
Avatar billede nielle Nybegynder
09. november 2005 - 21:03 #17
Nej, fejlbeskeden går udelukkende på at man ikke kan bruge LIMIT i en IN-subselect; Ikke på at man slet ikke kan bruge IN.

Denne kode skulle klare jobbet:

<?
$idArr = array();

$sql = "SELECT id FROM noticeboard ORDER BY id DESC LIMIT 50";
$query = mysql_query($sql) or die(mysql_error());

while ($row = mysql_fetch_assoc($query)
{
    $idArr[] = $row["id"];
}

$sql = "DELETE FROM noticeboard WHERE id NOT IN (" . implode(",", $idArr) . ")";
mysql_query($sql) or die(mysql_error());
?>
Avatar billede nielle Nybegynder
21. november 2005 - 18:53 #18
Har du fået kigget på det?
Avatar billede cmau Nybegynder
22. november 2005 - 16:00 #19
Nej har ikke haft tid, men smid svar, så må jeg vende tilbage en anden gang hvis det ikke virker.
Avatar billede nielle Nybegynder
22. november 2005 - 17:41 #20
Jeg er nu rimeligt sikker på at det virker ... og det burde jo heller ikke tage mange minutter at tjekke efter.

Du vender selvfølgeligt bare tilbage hvis der er mere ... og et svar ind til da :^)
Avatar billede nielle Nybegynder
11. december 2005 - 20:23 #21
Husk nu at acceptere svaret :^)

Har du i øvrigt fået det til at virke 100%
Avatar billede cmau Nybegynder
14. december 2005 - 16:48 #22
Det blev ikke så nædvendigt igen, da min ven bare valgte at tømme databasen hver dag.
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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