Menu

DELETE SELECT [Résolu]

mikesunshine59 73 Messages postés lundi 22 janvier 2018Date d'inscription 24 février 2018 Dernière intervention - 22 janv. 2018 à 12:12 - Dernière réponse : Reivax962 3224 Messages postés jeudi 16 juin 2005Date d'inscription 18 mai 2018 Dernière intervention
- 23 janv. 2018 à 10:58
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
Afficher la suite 

Votre réponse

15 réponses

Meilleure réponse
Fallentree 2175 Messages postés mercredi 25 février 2009Date d'inscription 17 février 2018 Dernière intervention - Modifié par Fallentree le 22/01/2018 à 20:36
1
Merci

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 ???

Merci Fallentree 1

a aidé 786531 internautes ce mois-ci

Commenter la réponse de Fallentree
jordane45 21176 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 25 mai 2018 Dernière intervention - 22 janv. 2018 à 13:45
0
Merci
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 ) 


mikesunshine59 73 Messages postés lundi 22 janvier 2018Date d'inscription 24 février 2018 Dernière intervention - 22 janv. 2018 à 14:32
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 ?
Fallentree 2175 Messages postés mercredi 25 février 2009Date d'inscription 17 février 2018 Dernière intervention - 22 janv. 2018 à 16:10
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.
Commenter la réponse de jordane45
jordane45 21176 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 25 mai 2018 Dernière intervention - Modifié par jordane45 le 22/01/2018 à 15:44
0
Merci
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
                        )  
mikesunshine59 73 Messages postés lundi 22 janvier 2018Date d'inscription 24 février 2018 Dernière intervention - 22 janv. 2018 à 16:52
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
Commenter la réponse de jordane45
Fallentree 2175 Messages postés mercredi 25 février 2009Date d'inscription 17 février 2018 Dernière intervention - Modifié par Fallentree le 22/01/2018 à 16:05
0
Merci
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)
Commenter la réponse de Fallentree
Fallentree 2175 Messages postés mercredi 25 février 2009Date d'inscription 17 février 2018 Dernière intervention - 22 janv. 2018 à 16:09
0
Merci
DELETE 
FROM matable
WHERE (Id, datecreation) = (SELECT Id, MIN(datecreation ) FROM matable GROUP BY Id)
mikesunshine59 73 Messages postés lundi 22 janvier 2018Date d'inscription 24 février 2018 Dernière intervention - 22 janv. 2018 à 16:48
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
mikesunshine59 73 Messages postés lundi 22 janvier 2018Date d'inscription 24 février 2018 Dernière intervention - 22 janv. 2018 à 22:40
Tu as un +10 !

Ca fonctionne c'est top !
Reivax962 3224 Messages postés jeudi 16 juin 2005Date d'inscription 18 mai 2018 Dernière intervention - 23 janv. 2018 à 10:58
Ça fonctionne mais regarde quand même mon message en dessous sur le HAVING
Commenter la réponse de Fallentree
Reivax962 3224 Messages postés jeudi 16 juin 2005Date d'inscription 18 mai 2018 Dernière intervention - 22 janv. 2018 à 16:57
0
Merci
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
Commenter la réponse de Reivax962
Reivax962 3224 Messages postés jeudi 16 juin 2005Date d'inscription 18 mai 2018 Dernière intervention - 22 janv. 2018 à 17:02
0
Merci
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
mikesunshine59 73 Messages postés lundi 22 janvier 2018Date d'inscription 24 février 2018 Dernière intervention - 22 janv. 2018 à 17:37
Je pense aussi mais ca ne fonctionne pas cette requete
Reivax962 3224 Messages postés jeudi 16 juin 2005Date d'inscription 18 mai 2018 Dernière intervention - 22 janv. 2018 à 18:11
Dis-en plus.
Quel est le message d'erreur ?
Est-ce que la sous-requête, exécutée seule, fonctionne ?
Commenter la réponse de Reivax962