DELETE SELECT

Résolu
mikesunshine59 Messages postés 75 Statut Membre -  
Reivax962 Messages postés 3742 Statut Membre -
Bonjour,

J'ai une table et je voudrais supprimer les données les plus vieille.

J'ai mis ceci mais ca ne fonctionne pas : DELETE FROM matable WHERE datecreation (SELECT ID, MIN(datecreation ) FROM matable GROUP BY ID)

ID peut avoir plusieurs fois la même chose.
La date de creation est en timestamp

Merci pour votre aide.

Mika

7 réponses

  1. Fallentree Messages postés 2445 Statut Membre 210
     

    CREATE TABLE IF NOT EXISTS `Course` (`Id` varchar(80) ,`date` int(10) );

    INSERT INTO `Course` (`Id`,`DATE`) VALUES ('Pommes', '101010'),('Poires', '101010'),('Pommes', '101012'),('Poires', '101012');

    CREATE VIEW Doublon AS
    SELECT Id AS Produit,Min(date) as date
    FROM Course
    GROUP BY ID;

    DELETE FROM Course
    WHERE EXISTS (SELECT Doublon.Produit,Doublon.date FROM Doublon where Doublon.Produit=Course.Id and Doublon.date=Course.date);

    DROP VIEW Doublon;



    Ca fonctionne
    Note le EXISTS

    J'aurais un +1 ???
    1
  2. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    Bonjour,

    Tu n'as pas mis de condition dans ton WHERE....
    WHERE datecreation  ....
    


    Il faut lui dire si c'est EGALE ou DIFFERENTE ou SUPERIEUR.. ou INFERIEUR.... IN ;. NOT IN ....etc

    Dans ton cas ça serait un = je pense
    DELETE 
    FROM matable 
    WHERE datecreation = (SELECT MIN(datecreation ) FROM matable ) 
    


    0
    1. mikesunshine59 Messages postés 75 Statut Membre
       
      Merci Jordane pour ton retour,

      Le problème persiste.
      Dans ma table j'ai deux colonnes. A (l'ID) et B (La date)
      Exemple :
      A = PAPA / B = 23/01/2018
      A = MAMAN / B = 21/01/2018
      A = PAPA / B = 22/01/2018
      A = MAMAN / B = 20/01/2018

      La requete doit supprimer la 3ème et 4ème ligne (et non pas la 4ème ligne uniquement)

      J'ai mis:
      DELETE
      FROM matable
      WHERE datecreation = (SELECT MIN(datecreation) FROM matable GROUP BY Id)

      Tu peux m'aider stp ?
      0
    2. Fallentree Messages postés 2445 Statut Membre 210
       
      A lieu de PAPA MAMAN, tu aurais pu mettre des pommes; des poires et des scoubidou bidous.
      Je sais les scoubidous ne sont pas périssables ....
      Pour la suite, passe un identifiant auto incrémenté ou un numéro de ligne pour éviter de te prendre le scoubidou.
      0
  3. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    Déjà...rassure moi ... tes dates .... elles sont bien en format de date TIMESTAMP ou DATETIME hein ??? Tu n'as pas mis des dates à la française j'espère... (dans du varchar).

    Ensuite.. ce que tu veux c'est supprimer, pour chaque ID la ligne la plus ancienne ??

    Dans ce cas ça serait un truc du genre :
    DELETE 
    FROM matable 
    WHERE ID IN (SELECT T.ID 
                             FROM ( SELECT ID, MIN(datecreation )
                                            FROM matable GROUP BY ID
                                          ) T
                            )  
    
    0
    1. mikesunshine59 Messages postés 75 Statut Membre
       
      Oui je te rassure le format est timestamp

      J'ai testé ce que tu proposes. Je n'ai pas d'erreur mais cela efface tout
      0
  4. Fallentree Messages postés 2445 Statut Membre 210
     
    comment tu veux supprimer par l id , ils sont identiques ...
    ca fait longtemps que je n'est plus pratiqué. mais ça me choque.
    essaie d’écrire la requête pour avoir les éléments voulus et il faut passer les deux références id et date car y a pas unicité. ici
    DELETE FROM T_PROSPECT
    WHERE (CLI_NOM, CLI_PRENOM) = (SELECT PRP_NOM, PRP_PRENOM
    FROM T_CLIENT)
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Fallentree Messages postés 2445 Statut Membre 210
     
    DELETE 
    FROM matable
    WHERE (Id, datecreation) = (SELECT Id, MIN(datecreation ) FROM matable GROUP BY Id)
    0
    1. mikesunshine59 Messages postés 75 Statut Membre
       
      La réponse à cette requête est : #1093 - Table 'matable' is specified twice, both as a target for 'DELETE' and as a separate source for data
      0
    2. mikesunshine59 Messages postés 75 Statut Membre
       
      Tu as un +10 !

      Ca fonctionne c'est top !
      0
    3. Reivax962 Messages postés 3742 Statut Membre 1 011
       
      Ça fonctionne mais regarde quand même mon message en dessous sur le HAVING
      0
  7. Reivax962 Messages postés 3742 Statut Membre 1 011
     
    Bonjour,

    Attention ! Dans toutes les réponses données, on supprime la ligne avec la date la plus ancienne... Même si c'est la seule ! Ce qui aura vite fait de te supprimer toutes tes données !!
    Rajoute un HAVING count(*) > 1 après ta clause GROUP BY pour ne supprimer que celles qui ont au moins deux lignes (et du coup tu peux aussi te garder un historique minimal des X dernières dates pour chaque ID, en remplaçant 1 par X)

    Xavier
    0
  8. Reivax962 Messages postés 3742 Statut Membre 1 011
     
    Bonjour,

    Je ne pense pas que la sous-requête soit la bonne méthode.
    Une jointure serait plus facile à gérer, de ce genre :

    DELETE t1 
    FROM matable t1
    INNER JOIN 
    (
        SELECT Id, MIN(datecreation) as minDate FROM matable GROUP BY Id HAVING count(*) > 1
    ) T2 ON T1.Id = T2.Id AND t1.datecreation = t2.minDate;
    


    Xavier
    0
    1. mikesunshine59 Messages postés 75 Statut Membre
       
      Je pense aussi mais ca ne fonctionne pas cette requete
      0
    2. Reivax962 Messages postés 3742 Statut Membre 1 011
       
      Dis-en plus.
      Quel est le message d'erreur ?
      Est-ce que la sous-requête, exécutée seule, fonctionne ?
      0