[SQL] Garder les 10 derniers tuple par id_usr

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. 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
    1. 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
      1. En gros supprimer tous les messages de chaque utilisateurs sauf les 10 derniers ?
        0
        1. Oui :)
          Désolé, tout parait clair dans ma tête, mais dès qu'il s'agit de l'expliquer...

          Jack
          0
          1. 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
            1. 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
              1. Quelqu'un d'autre à une idée ?
                0