[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 :) ?

8 réponses

  1. 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
  2. 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
  3. 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
  4. JackBower
     
    Oui :)
    Désolé, tout parait clair dans ma tête, mais dès qu'il s'agit de l'expliquer...

    Jack
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. 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
  7. 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
  8. JackBower
     
    Quelqu'un d'autre à une idée ?
    0