IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Supprimer x messages d'une table en gardant les 20 récents


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué Avatar de raffa
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    194
    Détails du profil
    Informations personnelles :
    Âge : 26
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 194
    Points : 159
    Points
    159
    Par défaut Supprimer x messages d'une table en gardant les 20 récents
    Bonjour,
    j'ai un minichat et je souhaiterais garder les 20 derniers messages postés et je voudrais savoir si c'est possible de supprimer les anciens messages au fur et a mesure qu'ils sont ajoutés en n'en gardant que les 20 les plus récents dans la table et tout ça en une seule requête, sauf pour l'ajout ?

    Si c'est possible alors comment faire ?

    Anciennement je faisais ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    <?php
    $n = 5; 
    $nb_max = 25;
     
    $sql_count = "SELECT COUNT(*) AS nb_messages FROM minichat";
    $res_count = mysql_query($sql_count) or die(mysql_error());
    $data = mysql_fetch_array($res_count);
    $totalPost = $data['nb_messages'];
     
    if ($totalPost >= $nb_max)
    {
      $sql_d = "DELETE FROM minichat ORDER BY id LIMIT ".$n;
      $res_d = mysql_query($sql_d)or die(mysql_error());
      mysql_free_result($res_d);
    }
     
    mysql_close();
    ?>
    ça marche mais c'est possible de faire plus simple ?

    D'avance merci

  2. #2
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 903
    Points : 6 027
    Points
    6 027
    Par défaut
    Quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DELETE from minichat
    WHERE id not in (
    SELECT id from minichat order by id desc limit 25)
    Au passage, tu demandes 20 mais ta variable est à 25...

    (code non testé)
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  3. #3
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    @qi130 : MySQL restreint drastiquement l'utilisation de LIMIT et ORDER BY dans les sous-requêtes, donc ça ne va pas le faire.

    @raffa : tu peux le faire comme ça, mais je ne suis pas sûr qu'on puisse parler de simplification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DELETE C 
    FROM minichat C
      INNER JOIN (
        SELECT C1.id 
        FROM minichat C1 INNER JOIN minichat C2 ON C1.id <= C2.id 
        GROUP BY C1.id
        HAVING COUNT(*) > 20
        ) C3 ON C.id = C3.id;
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  4. #4
    Membre habitué Avatar de raffa
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    194
    Détails du profil
    Informations personnelles :
    Âge : 26
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 194
    Points : 159
    Points
    159
    Par défaut
    Merci à vous deux d'avoir prit le temps de vous pencher sur le problème.
    @ antoun, non effectivement on ne peut pas parler de simplification dans ce cas mais je vais quand meme la garder dans mes favoris.

    Résolu.

  5. #5
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Si c'est un processus régulier, le mieux est sans doute de l'enregister en proc stock :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE PROCEDURE EliminerSauf20()
    DELETE C 
    FROM minichat C
      INNER JOIN (
        SELECT C1.id 
        FROM minichat C1 INNER JOIN minichat C2 ON C1.id <= C2.id 
        GROUP BY C1.id
        HAVING COUNT(*) > 20
        ) C3 ON C.id = C3.id;

    Ce qui simplifie ensuite largement ton code PHP :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_query("CALL EliminerSauf20()") ;
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  6. #6
    Membre à l'essai
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    20
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 20
    Points : 23
    Points
    23
    Par défaut
    Cette syntaxe du DELETE est nouvelle pour moi (nommer le nom d'une table avant FROM).

    Est-ce que cela fait parti de la norme SQL ?
    Ou est-ce une astuce de MySQL pour pallier à ses "lacunes" concernant les sous-requêtes et les ordres DELETE et UPDATE ?

  7. #7
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    c'est effectivement une syntaxe spécifique à MySQL, de même qu'il existe un "UPDATE multitable" spécifique.
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 39
    Dernier message: 28/07/2006, 14h22
  2. Réponses: 1
    Dernier message: 29/05/2006, 10h50
  3. Comment supprimer un verrou sur une table ?
    Par Laure13 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 13/03/2006, 15h10
  4. Réponses: 17
    Dernier message: 18/03/2005, 15h56
  5. Supprimer un champ dans une table
    Par valerie90 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 24/08/2004, 09h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo