Supprimer les doublons d'une table mysql

  • Auteur de la discussion Auteur de la discussion poupilou
  • Date de début Date de début
WRInaute passionné
Salut à tous,

J'essaie de supprimer les doublons d'une de mes tables MySQL, pour cela je me suis inspiré de ce tuto mais j'ai un peu de mal avec la requête qui supprime les doublons.

Voici les 3 colonnes de ma table MySQL qui m'intéressent :
Num
Num produit
Prix total

La colonne "Num" est du type int et sa valeur est unique.

La colonne "Num produit" est du type vachar et il peut y avoir des doublons dans cette colonne.

La colonne "Prix total" est du type decimal.

Je cherche les doublons de ma colonne "Num produit" et je souhaite supprimer ces doublons en fonction de leur prix, qui sont classés du plus grand au plus petit. On laisse donc dans la table le produit qui est le moins cher.

Voici la requête mysql que j'ai faite :

Code:
$result = get_requete("SELECT COUNT(*) AS nbr_doublon, `Num produit` FROM `$stock_produits` WHERE $stock_produits.`Num produit`!='' AND $stock_produits.`Num produit`!='0' AND $stock_produits.`Num produit`!='1' GROUP BY `Num produit` HAVING COUNT(*) > 1");
while($voir = $MysqliFetchArray($result))
{
get_requete("DELETE FROM `$stock_produits`
LEFT OUTER JOIN (
        SELECT MAX(Prix total) as prix, `Num produit`, `Prix total`
        FROM `$stock_produits`
        GROUP BY `Num produit`
    ) as t1
    ON `$stock_produits`.`Prix total` = t1.prix
WHERE t1.prix IS NULL");
Cette requête ne supprime pas les doublons, voyez-vous des erreurs dans ma requête MySQL ci-dessus ?

Merci pour votre aide.
 
Nouveau WRInaute
Bonjour,

La requête est un peu compliquée, mais peut-être en passant sur une jointure de la table sur elle-même ça serait plus simple

Voici une requête (non testée) qui :
  • Supprime les doublons en cas de prix supérieur
  • Conserve qu'une seule ligne en cas de prix équivalent.
Code:
SELECT DISTINCT A.NUM
FROM `$stock_produits` A, FROM `$stock_produits` B
WHERE A.`Num produit` = B.`Num produit`
AND ((A.NUM <> B.NUM AND A.PRIX > B.PRIX)
OR (A.NUM > B.NUM AND A.PRIX = B.PRIX))

Il resterait à mettre tout ça dans un DELETE

J'espère que ça pourra t'aider
 
Dernière édition:
WRInaute passionné
Merci pour ta réponse.

Etant donné que j'ai beaucoup de données dans ma table, j'ai trouvé cette solution qui est très rapide pour supprimer les doublons de ma table :

Code:
-- Create temporary table
CREATE TABLE temp_table LIKE `$stock_produits`;

-- Add constraint
ALTER TABLE temp_table ADD UNIQUE(Num produit);

-- Copy data
INSERT IGNORE INTO temp_table SELECT * FROM `$stock_produits`;

-- Rename and drop
RENAME TABLE `$stock_produits` TO old_table1, temp_table TO `$stock_produits`;
DROP TABLE old_table1;
 
Discussions similaires
Haut