[SQL] Garder les 10 derniers tuple par id_usr

JackBower -  
 JackBower -
Bonjour,

Je souhaiterai construire une requête SQL unique qui permet de garder uniquement les 10 derniers réusultats par id_user. Je m'explique :

J'ai une table MESSAGE dont voici la structure :
- id : int (auto-increment)
- id_user : int -> utilisateur qui a posté le message
- texte : txt -> text du message... (ou autre champs qui importe peu, au final)

Je souhaiterai qu'à l'exécution d'une unique requête SQL, la table comporte uniquement les 10 derniers message de chaque user.

NB : Je suis sur MySQL (je pense que la version importe peu)

Par exemple cette requete fait exactement ce que je souhaite, mais pour un seul utilisateur:
DELETE FROM MESSAGE WHERE id_user = "1" limit 10, 6456542


Pouvez-vous m'aider à me sortir de cette mélasse, s'il vous plait :) ?
A voir également:

8 réponses

Kafiristanica Messages postés 266 Date d'inscription   Statut Membre Dernière intervention   28
 
tu veux supprimer les 10 derniers messages?

DELETE FROM MESSAGE WHERE id IN (SELECT count(id) FROM MESSAGE ) limit 10, 6456542;

Je pense à ça, à tester
0
JackBower
 
Non, je souhaite garder, pour chaque id_user distinct les 10 derniers messages (qui on l'id le plus élevé)

c'est à dire avoir les données tels que
id	id_user	message
867	1	bla
868	1	bla
869	1	bla
870	1	bla
871	1	bla
872	1	bla
873	1	bla
874	1	bla
875	1	bla
876	1	bla
877	1	bla
878	2	bla
879	2	bla
880	2	bla
881	2	bla
882	2	bla
883	2	bla
884	2	bla
885	3	bla
886	3	bla
887	3	bla
888	3	bla
889	3	bla
890	3	bla
891	3	bla
892	3	bla
893	3	bla
894	3	bla
895	3	bla


Ainsi, le user 1 a ses 10 derniers messages
Ainsi, le user 2 a ses 7 derniers messages (car il en a écrit que 7)
Ainsi, le user 3 a ses 10 derniers messages

Voyez-vous ?
0
Kafiristanica Messages postés 266 Date d'inscription   Statut Membre Dernière intervention   28
 
En gros supprimer tous les messages de chaque utilisateurs sauf les 10 derniers ?
0
JackBower
 
Oui :)
Désolé, tout parait clair dans ma tête, mais dès qu'il s'agit de l'expliquer...

Jack
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Kafiristanica Messages postés 266 Date d'inscription   Statut Membre Dernière intervention   28
 
J'ai des idées genre ca :


<?php   
require_once('sqlconnect.php');   

$query = 'SELECT id FROM xxxx ORDER BY id DESC LIMIT 0,10';   
$query_result = mysql_query($query);   

//Récupération des id du 10 eme a ... derniers enregistrements   
while($row = mysql_fetch_array($query_result)):   
    $id_array[] = $row['id'];   
endwhile;   

//Suppression pour chaque id récupéré auparavant   
foreach($id_array as $key=>$value):   
    mysql_query('DELETE FROM xxxx WHERE id = '.$value.' LIMIT 1');   
endforeach;   


?>


Mais je pense pas que ca convienne a ta table =s
Il faudrait une date par exemple pour connaitre les derniers messages
0
JackBower
 
Je ne pense pas que cette solution me convienne... cela revient à faire:
DELETE FROM MESSAGE ORDER BY id LIMIT 10, 456464


Non, ce que je cherche à faire est, comme tu l'a dit :
En gros supprimer tous les messages sauf les 10 derniers de chaque utilisateur.

En php, j'aurai pu faire (en simplifiant):
foreach($users as $user)
mysql_query("DELETE FROM MESSAGE WHERE id_user = ".$user->get_id()". ORDER BY id LIMIT 10, 456464)");


Mais je voudrais le faire en UNE requête SQL.
0
JackBower
 
Quelqu'un d'autre à une idée ?
0
JackBower
 
toujours pas ?
0