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

 MySQL Discussion :

Sélection de résultats identiques


Sujet :

MySQL

  1. #1
    Membre régulier Avatar de daajack
    Inscrit en
    Octobre 2007
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 97
    Points : 97
    Points
    97
    Par défaut Sélection de résultats identiques
    Bonjour tlm,

    Je suis débutant en mysql, et je cherche à faire un truc assez simple, j'aimerais récupérer des résultats mysql ayant des valeurs identiques.

    Je m'explique, j'ai une table avec plusieurs clés primaires que j'aimerais mettre à jour, malheureusement je dois remplacer plusieurs valeurs de ces clé par des valeurs identiques, mysql me renvoit donc une erreur duplicate key entry.

    Je veux donc effectué un SELECT sur les lignes qui posent problème en n'affichant que celle-ci, pour les modifier manuellement au cas par cas.

    J'aimerais un résultat qui ressemble à ça (c.f. tables ci-dessous) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    id1  id2  val  id_old  id_new
    15   18   ...    18     1002
    15   19   ...    19     1002
                             ^ La requête n'affiche les lignes qu'à partir de 2 résultats similaires.
    J'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM matable AS tab
    LEFT JOIN table_upd AS upd ON tab.id2 = upd.id_old
    HAVING COUNT(id_new) > 1
    Mais ça ne marche pas.

    Voici les tables utilisées dans mon exemple :
    Je met à jour id2 par rapport à la deuxième table (table_upd)

    matable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    id1 : 15
    id2 : 18
    val : Chacal
    -----------
    id1 : 15
    id2 : 19
    val : Galipode
    -----------
    id1 : 15
    id2 : 23
    val : Ornitorinque
    table_upd (table de màj) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    id_old : 23
    id_new : 1001
    -----------------
    id_old : 18
    id_new : 1002 # ce champ...
    -----------------
    id_old : 19
    id_new : 1002 # ...et ce champ rentrent en conflit
    Auriez-vous, gentlemen (women?) de plus corrects propositions ?
    Merci d'avance.

    Toute ressemblance avec des tables ou des champs existants serait purement fortuite et involontaire.

  2. #2
    Membre averti Avatar de nicoaix
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 571
    Points : 362
    Points
    362
    Par défaut
    Bonjour,
    Sans vouloir éluder la question il me semble que le problème est plus d'ordre conceptuel que technique. L'utilisation de clés (numérique en l'occurence) primaires permet en plus de préserver l'unicité des tuples, de s'affrenchir de leur mise à jour. Pour cela il suffit d'utiliser la fonction d'incrémentation automatique de MySql. C'est alors MySql que se chargera de faire les "mises à jour".

    Pour répondre un peu plus à la question posée, tu dis "je dois remplacer plusieurs valeurs de ces clé par des valeurs identiques". Ce n'est pas possible. Par définition une clé primaire est unique. Tu ne pourras donc pas avoir des valeurs identiques pour une clé primaire.

  3. #3
    Membre régulier Avatar de daajack
    Inscrit en
    Octobre 2007
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 97
    Points : 97
    Points
    97
    Par défaut
    Oui j'avais bien pensé
    Je ne veux pas forcer mysql à avoir plusieurs clés primaires identiques, je voudrais afficher les enregistrements qui posent problème pour les modifier / supprimer manuellement en contrôlant la raison de leur existence précaire.
    C'est donc un SELECT des champs identiques que je veux faire.

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Bonjour,

    Il faut être au moins en MySQL 4.1 pour que la requête suivante passe (il y a une sous-requête) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT * FROM matable tab
    LEFT JOIN table_upd upd on tab.id2 = upd.id_old
    WHERE upd.id_new IN (
      SELECT id_new
      FROM table_upd
      GROUP BY id_new
      HAVING COUNT(id_new) > 1
    )
    ced

  5. #5
    Membre régulier Avatar de daajack
    Inscrit en
    Octobre 2007
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 97
    Points : 97
    Points
    97
    Par défaut
    Xtra c'est classe.
    Ca fonctionne bien, excepté qu'il me sort des résultats où id2 est effectivement lié à des résultat qui sont dupliqués, mais à un seul d'entre eux, ces lignes là ne me posant pas problème.

    Dans mon exemple ce serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    id1 : 16
    id2 : 18
    val : Orque des neiges
    ----------
    id1 : 16
    id2 : 23
    val : Bison futé
    La première ligne apparaissant dans ma liste.
    Il faudrait donc ajouté une clause GROUP BY et HAVING sur le champ id1, style :
    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
     
    SELECT * FROM matable AS tab
    LEFT JOIN table_upd AS upd ON tab.id2 = upd.id_old
    WHERE id1 IN (
      SELECT tab.id1 FROM matable AS tab
      LEFT JOIN table_upd AS upd ON tab.id2 = upd.id_old
      WHERE upd.id_new IN (
        SELECT id_new
        FROM table_upd
        GROUP BY id_new
        HAVING COUNT(id_new) > 1
      )
      GROUP BY id1
      HAVING COUNT(id1) > 1
    )
    Je n'ai pas testé la requête, déjà que l'autre met une plombe à s'exécuter, et de toute manière j'ai fait un ORDER BY et je peux facilement voir si il y'a des duplications sur les quelques résultats qu'il me restent.

    Merci beaucoup pour ton aide.
    A+

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

Discussions similaires

  1. Sélection à partir résultat d'une expression
    Par kstepankova dans le forum QlikView
    Réponses: 2
    Dernier message: 12/11/2012, 16h51
  2. Sélection du résultat lors d'un group by
    Par lodan dans le forum MySQL
    Réponses: 8
    Dernier message: 09/03/2010, 13h43
  3. [PHP 4] Colorer les résultats identiques dans une boucle
    Par renaud26 dans le forum Langage
    Réponses: 7
    Dernier message: 15/01/2010, 14h57
  4. [MySQL] Supprimer la répitition des résultats identiques dans une liste déroulante
    Par ghyosmik dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 13/03/2008, 17h33
  5. Sélection d'enregistrement parmis plusieurs identiques
    Par monnoliv dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 24/09/2005, 15h32

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