Avatar billede yvette Nybegynder
07. september 2006 - 21:06 Der er 24 kommentarer og
1 løsning

Slet alt på nær de 2 items med højst id

Jeg har en tabel der hedder users_last som indeholder:
id, username, lastdate.

Også vil jeg gerne have gjort med php/mysql så at alt blir slettet i tabellen users_last undtaget 2, hvilket er de 2 som har højst id.

Jeg har prøvet forskellige ting, men kan ikke helt hitte ud af hvordan jeg får det gjort. Håber i kan hjælpe mig!
Avatar billede jensgram Nybegynder
07. september 2006 - 21:14 #1
Utestet, men ifølge http://dev.mysql.com/doc/refman/5.0/en/delete.html

Hvis du nu tæller antallet af entiteter (SELECT COUNT(id) FROM users_last)
og så

DELETE FROM users_last ORDER BY id DESC LIMIT [antal-2]

???
Avatar billede nielle Nybegynder
07. september 2006 - 21:14 #2
Sådan?

DELETE FROM users_last WHERE id NOT IN (SELECT id FROM users_last ORDER BY id DESC LIMIT 2)
Avatar billede jensgram Nybegynder
07. september 2006 - 21:15 #3
Jeg kan ikke lige lure, hvordan man "tæller" i samme statement som man sletter - det er jeg ikke hård nok i SQL til...


RETTELSE: Hov - der skulle stå ASC i stedet for DESC
Avatar billede jensgram Nybegynder
07. september 2006 - 21:15 #4
...og så var der en, der kunne vise også hvordan man gør det ;)
Avatar billede yvette Nybegynder
07. september 2006 - 21:17 #5
Sorry men er lidt mindre dum i øjeblikket, i må sq hjælpe mig lidt bedre på vej! Jeg har glemt en del af det her php/mysql sjov... Jeg var sgu ved at være hård til det på et tidspunkt, men efter en pause så glemmer man hurtigt åbenbart :(
Avatar billede yvette Nybegynder
07. september 2006 - 21:18 #6
Dvs. nielle du siger sådan her?

mysql_query("DELETE FROM users_last WHERE id NOT IN (SELECT id FROM users_last ORDER BY id DESC LIMIT 2)");
Avatar billede nielle Nybegynder
07. september 2006 - 21:20 #7
Jep, men sæt lige noget fejlhåndtering på:

mysql_query("DELETE FROM users_last WHERE id NOT IN (SELECT id FROM users_last ORDER BY id DESC LIMIT 2)") or die(mysql_error());
Avatar billede yvette Nybegynder
07. september 2006 - 21:21 #8
Jeg prøver det lige :)
Avatar billede yvette Nybegynder
07. september 2006 - 21:22 #9
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 'SELECT id FROM users_last ORDER BY id DESC LIMIT 2)' at line 1
Avatar billede nielle Nybegynder
07. september 2006 - 21:27 #10
Så er din MySQL nok ikke ny nok til at acceptere sub-selects. Det kræver vist 4.1 eller senere.
Avatar billede yvette Nybegynder
07. september 2006 - 21:27 #11
MySQL - 4.0.27
Avatar billede yvette Nybegynder
07. september 2006 - 21:27 #12
Jeg må da kunne få det lavet på en måde :(
Avatar billede nielle Nybegynder
07. september 2006 - 21:29 #13
Har du afprøvet det andet foreslag? 07/09-2006 21:14:10
Avatar billede yvette Nybegynder
07. september 2006 - 21:29 #14
MySQL klientversion: 4.1.15, det står der også et sted... Jeg er hostet hos www.surftown.dk
Avatar billede yvette Nybegynder
07. september 2006 - 21:30 #15
Jeg forstår ikke helt det jensgram har skrevet :|
Avatar billede yvette Nybegynder
07. september 2006 - 21:34 #16
Deike: MySQL 4.1.15

Har lige snakket med surftown support, de siger det er denne version!
Avatar billede nielle Nybegynder
07. september 2006 - 21:39 #17
Mystisk...

Her er den samme løsning, dog bare med nogete mere PHP i stedet for det MySQL ikke vil være med til:

$sql = "SELECT id FROM users_last ORDER BY id DESC LIMIT 2";
$result = mysql_query($sql) die(mysql_error());

$inPartArr = array();
while ($row = mysql_fetch_assoc($result))
    $inPartArr[] = $row["id"];

if (count($inPartArr) > 0)
{
    $sql = "DELETE FROM users_last WHERE id NOT IN (" . implode(",", $inPartArr) . ")";
    mysql_query($sql) die(mysql_error());
}
Avatar billede yvette Nybegynder
07. september 2006 - 21:42 #18
Parse error: syntax error, unexpected T_EXIT in /hsphere/local/home/pheobus/xzine.info/toplogind.php on line 48

Den vil bare ingenting i dag :(
Avatar billede nielle Nybegynder
07. september 2006 - 21:44 #19
mysql_query($sql) die(mysql_error());

- rettes til:

mysql_query($sql) or die(mysql_error());
Avatar billede nielle Nybegynder
07. september 2006 - 21:44 #20
Begge steder...
Avatar billede yvette Nybegynder
07. september 2006 - 21:49 #21
Fedt det virkede, mange tak... Smider du et svar :)
Avatar billede nielle Nybegynder
07. september 2006 - 21:51 #22
Svar :^)
Avatar billede jensgram Nybegynder
07. september 2006 - 22:10 #23
Det jeg mente var:


$cntTotal = mysql_result(mysql_query('SELECT COUNT(id) FROM users_last'), 0);
mysql_query('DELETE FROM users_last ORDER BY id ASC LIMIT ' . ($cntTotal - 2));
Avatar billede jensgram Nybegynder
07. september 2006 - 22:11 #24
... den vil efterlade de "sidste" 2 brugere.

ex: $cntTotal = 77 => DELETE FROM users_last ORDER BY id ASC LIMIT 75
Avatar billede yvette Nybegynder
09. september 2006 - 18:23 #25
Glemte og trykke accept på svar... hehe! Det er gjort nu!
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
Computerworld tilbyder specialiserede kurser i database-management

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