Supprimer entrées supérieures à 6

Eléphant du PHP | 233 Messages

05 oct. 2016, 16:49

Bonjour à tous,
une question sans doute toute idiote, mais je ne trouve rien sur les forums :

je voudrais supprimer toutes les entrées d'une table qui sont supérieures à 6.

J'enregistre les données jusqu'à 6 en ensuite je veux supprimer les suivantes.

J'utilise mysqli avec ORBER BY pour garder les 6 dernières enregistrées et LIMIT pour supprimer le reste (après les 6 premières).

comment faire avec LIMIT ?

Merci d'avance

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

06 oct. 2016, 11:53

salut,

il faut ruser un peu
delete from latable where id not in (select id from latable where le predicat order by colonnequivabien limit 6)
en gros supprimer les lignes dont l'id n'est pas ceux que tu récupères et qui correspondent aux 6 derniers.
A toi d'adapter avec ta table et tes prédicats.

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 233 Messages

06 oct. 2016, 21:06

Bonsoir et merci de la réponse.

J'ai une erreur : This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

voici ma requête sql :
mysqli_query($bdd, "DELETE from vu WHERE id_serie not in (SELECT * FROM detail, vu, membre WHERE detail.id=vu.id_serie and vu.id_membre=membre.id and membre.id=".$_SESSION['id']."  ORDER BY vu.id DESC LIMIT 6)")or die(mysqli_error($bdd));
Merci d'avance

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

07 oct. 2016, 08:45

ha wé c'est con ça :)

du coup il faut faire autrement :)
il existe la fonction row_number(), bien que je ne l'ai pas retrouvée dans la doc (en fait j'ai l'impression que l'on trouve rien la dedans ...)

un truc dans le genre peux être
DELETE
FROM vu
WHERE id_serie NOT IN (
	SELECT t.id_serie
	FROM (
		SELECT vu.id_serie,row_number() over(PARTITION BY vu.id ORDER BY vu.id) rn
		FROM detail, vu, membre
		WHERE detail.id=vu.id_serie AND vu.id_membre=membre.id AND membre.id=$_SESSION['id']
		ORDER BY vu.id) t
	WHERE t.rn <=6
)
sinon demande à google ! mysql dense_rank le premier fournit une solution.

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 233 Messages

07 oct. 2016, 11:34

Bonjour,

ça ne marche pas alors j'ai adapté comme ceci :
$supprimer = mysqli_query($bdd, "SELECT vu.id FROM detail, vu, membre WHERE detail.id=vu.id_serie and vu.id_membre=membre.id and membre.id=".$_SESSION['id']."  ORDER BY vu.id DESC LIMIT 6,1") or die(mysqli_error($bdd));

		$msg = mysqli_fetch_array($supprimer);
		$id_msg = $msg['id'];
		
		if ($id_msg != NULL)
		{
			mysqli_query($bdd, 'DELETE FROM vu WHERE id<='.$id_msg) or die(mysqli_error($bdd));
		}
Là ça fonctionne, vous en pensez quoi ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

07 oct. 2016, 13:35

ça marche pas c'est pas un diagnostique ;)

la fonctionnalité est la c'est le principal. bien que je pense que cela est possible en une seule requête c'est étonnant que cela ne fonctionne pas :/

@+
Il en faut peu pour être heureux ......