[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

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

        Jack
        1. En gros supprimer tous les messages de chaque utilisateurs sauf les 10 derniers ?
          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 ?
            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