Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Débuter
Débuter Forum d'entraide pour débuter avec MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/03/2008, 15h10   #1
Membre régulier
 
Avatar de daajack
 
Inscription : octobre 2007
Messages : 97
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 97
Points : 78
Points : 78
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 :
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 :
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 :
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 :
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.
daajack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2008, 15h43   #2
Membre éclairé
 
Avatar de nicoaix
 
Homme
Chef de projet MOA
Inscription : décembre 2004
Messages : 561
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet MOA
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 561
Points : 325
Points : 325
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.
nicoaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2008, 16h15   #3
Membre régulier
 
Avatar de daajack
 
Inscription : octobre 2007
Messages : 97
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 97
Points : 78
Points : 78
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.
daajack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2008, 10h01   #4
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 413
Points : 6 413
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 :
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
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2008, 09h01   #5
Membre régulier
 
Avatar de daajack
 
Inscription : octobre 2007
Messages : 97
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 97
Points : 78
Points : 78
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 :
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 :
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+
daajack est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h05.


 
 
 
 
Partenaires

Hébergement Web