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 doublons sauf le minimum


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Juillet 2006
    Messages : 232
    Points : 79
    Points
    79
    Par défaut supprimer doublons sauf le minimum
    bonjour,
    dans une table j'ai des 'doublons' que je veux supprimer sauf celui ayant la plus petite valeur.par exemple je prend le cas de 2 doublons:
    id ,4, 2, 35
    id ,11, 1, 4

    je veux supprimer la ligne qui ne contient pas 1 qui est la plus petite valeur cad
    garder seulement id ,11, 1, 4 car 1 est le min de 4,2, 35,11, 1, 4

    ET si j'ai les 3 enregistrements

    id ,4, 2, 35
    id ,11, 1, 4
    id ,0, 1, 9

    je supprime tout sauf id ,0, 1, 9 car 0 est le min des valeurs (4, 2, 35 ,11, 1, 4 ,0, 1, 9)

    Est ce possible avec une simple requête mysql

    Merci

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu as vraiment ",4,2,35" inscrit dans une colonne dans ta base de données ?

    Le doublon n'est pas visible dans ce que tu nous montres, c'est normal ou bien je ne 'ai pas compris quelque chose ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Juillet 2006
    Messages : 232
    Points : 79
    Points
    79
    Par défaut
    Bonjour Sabotage,
    Tu as bien raison de dire que ce ne sont pas des doublons car ces enregistrements n'ont de commun que le champ ID et pour être plus précis comme ID n'est pas unique la clé est un autoincrement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    cle  ID C1  C2  C3
    ------------------
    1234, id ,4, 2, 35
    234, id ,11, 1, 4
    6532, id ,0, 1, 9
    Les champs c1, c2 et c3 sont des coûts.

    La requête doit supprimer tous les enregistrements sauf

    car il contient 0 qui est le minimum absolu de tous les coûts ayant ID en commun.

    Merci infiniment déjà de votre réponse précédente et merci d'avance pour la suite.

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Il faut que tu trouves la ligne pour un id donné qui la plus petite valeur des colonnes C1, C2 et C3 confondues.
    Ensuite tu supprimes toutes les lignes pour cet id, sauf celle qui a pour clé la clé que tu viens de trouver...
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  5. #5
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Juillet 2006
    Messages : 232
    Points : 79
    Points
    79
    Par défaut
    OUI
    C'est ça.
    Merci

  6. #6
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Et donc ? qu'est-ce qui te bloque ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  7. #7
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Juillet 2006
    Messages : 232
    Points : 79
    Points
    79
    Par défaut
    ReBonjour Celira,

    Ce qui bloque est la requête ou les requêtes qui me permettent d'effectuer cette tâche: je sais juste comment avor le min des 3 coûts mais seulement sur un enregistrement, genre
    Quant à comparer ce Min avec les Mins de tous les autres enregistrements qui partagent le même ID; puis tirer l'enregistrement élu pour le garder en supprimant tous les autres, je n'arrive pas à formuler ça.

    Merci d'avance

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Le plus petit des 9 ça ne serait pas simplement
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Juillet 2006
    Messages : 232
    Points : 79
    Points
    79
    Par défaut
    Bonjour,
    Peut être bien, mais c'est que la requête doit trouver l'enregistrement qui contient le plus petit absolu. puis elle doit le garder jalousement et supprimer tous les autres.

    Vous avez peut être raison en groupant par ID.

    En tout cas j'essaie àa aussi et je vous tiens au courant

    Merci d'avance

  10. #10
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Les lignes ayant leur plus petit qui est plus grand que le plus petit de tous ça ne serait pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    least(c1,c2,c3) > min(least(c1,c2,c3))
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  11. #11
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Juillet 2006
    Messages : 232
    Points : 79
    Points
    79
    Par défaut Sur le même sujet
    Bonjour Sabotage,Bonjour à tous
    Dans mes recherches/demandes sur le Net, voici une requête que quelqu'un m'a envoyé au même sujet. Seulement quand je l'exécute ça pose encore problème
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DELETE FROM couts WHERE serie NOT IN (
              SELECT t.serie
              FROM couts t
              JOIN (
                SELECT id, MIN(min_local) as min_global
                FROM (
                  SELECT id, LEAST(c1,c2,c3) as min_local
                  FROM couts
                )
              ) min_value ON min_value.id = t.id AND min_value.min_global = LEAST(t.c1,t.c2,t.c3)
            )


    La table s'appelle couts et la clé est serie

    Mais ça me sort le message d'erreur qui suit:

    #1248 - Every derived table must have its own alias
    J'avoue que je ne connais pas grand chose sur les alias des tables

    Merci d'avance.

  12. #12
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu as juste a donner un nom aux requêtes dérivés comme indiqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DELETE FROM couts WHERE serie NOT IN (
              SELECT t.serie
              FROM couts t
              JOIN (
                SELECT id, MIN(min_local) AS min_global
                FROM (
                  SELECT id, LEAST(c1,c2,c3) AS min_local
                  FROM couts t2
                ) t3
              ) min_value ON min_value.id = t.id AND min_value.min_global = LEAST(t.c1,t.c2,t.c3)
            )
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  13. #13
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Juillet 2006
    Messages : 232
    Points : 79
    Points
    79
    Par défaut
    Bonjour sabotage,

    Merci de cette réponse, car elle fait effectivement disparaître l'erreur et surtout m'apprend quelque chose d'important pour l'avenir avec ce SGBD fabuleux qu'est MySQL.

    Il subsite juste le message d'erreur qui suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #1093 - You can't specify target table 'couts' for update in FROM clause
    Ce qui m'intrigue c'est qu'il n'y a pourtant pas d'instruction update pour la table couts.

    Merci d'avance

  14. #14
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    essayez comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    DELETE X
    FROM couts AS X
    INNER JOIN couts AS Y
        ON X.id = Y.id
        AND LEAST(X.C1,X.C2,X.C3) > LEAST(Y.c1,Y.C2,Y.C3)

  15. #15
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Juillet 2006
    Messages : 232
    Points : 79
    Points
    79
    Par défaut
    Merci aieeeuuuuu de cette réponse,

    J'ai testé la requête et bien que ma table couts ne comporte que près de 5000 enregistrements, et qu'elle soit indexée sur le champ serie, ça tourne toujours, est-ce normal ?
    Y aurait-il quelque chose pour accélérer l'exécution ?
    Je sais aussi -par avance - que cette requête doit me supprimer normalement 39 enregistrements.


    Merci infiniment.

    PS: j'ai édité le message pour vous dire que cela fait une heure de temps et que ça tourne toujours c'est terriblement lent
    Ah il vient d'arrêter le mode graphique sans donner de résultat. Dois-je créer une colonne least(c1,c2,c3)?

  16. #16
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Il faudrait un index sur Id.

    Voire un index sur (Id, C1,C2,C3) pour qu'il couvre la requête...

  17. #17
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Juillet 2006
    Messages : 232
    Points : 79
    Points
    79
    Par défaut
    Bonjour aieeeuuuuu bonjour tout le monde;
    Merci beaucoup de cette réponse, qui résout ce problème de lenteur.

    Aussi je marque ce sujet comme Résolu

    Merci infiniment.

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

Discussions similaires

  1. Supprimer doublons dans requete
    Par fifoux dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 05/03/2007, 11h54
  2. [Tableaux] supprimer doublon d'une colonne
    Par melisse dans le forum Langage
    Réponses: 4
    Dernier message: 22/02/2007, 09h01
  3. [ListBox] Supprimer doublons
    Par mohamed dans le forum Delphi
    Réponses: 6
    Dernier message: 14/11/2006, 17h00
  4. Supprimer doublons sur 3 colonnes?
    Par pegase33 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 25/09/2006, 12h55
  5. [SQL Serveur 2K] Procédure pour Supprimer doublons
    Par Vesta dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 29/05/2006, 11h32

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