SQL - Garder uniquement les doublons (1) [Résolu/Fermé]

Signaler
Messages postés
331
Date d'inscription
dimanche 6 avril 2008
Statut
Membre
Dernière intervention
5 mai 2013
-
Messages postés
331
Date d'inscription
dimanche 6 avril 2008
Statut
Membre
Dernière intervention
5 mai 2013
-
Bonjour,

J'ai un Select qui me renvoi dans certains cas des valeurs en double.
Lorsque cela se présente, je voudrais conserver un exemplaire de toutes valeurs en doublons et supprimer ce qui n'apparaît qu'une fois.
Dans le cas contraire, la requête devra se faire "normalement" (afficher le résultat du select tel que).

Pour ceux qui connaisse le PHP, c'est l'équivalent de la fonction "array_unique".
EDIT: FAUX! la fonction "array_unique" supprime les doublons mais conserve les valeurs qui n'apparaisse qu'une fois. Désolé pour cette erreur.

Le hic, c'est que comme je stock les valeurs dans un tableau à deux dimensions, je ne peux pas utiliser cette fonction...

Merci d'avance pour vos idées!

6 réponses

Messages postés
331
Date d'inscription
dimanche 6 avril 2008
Statut
Membre
Dernière intervention
5 mai 2013
130
Very Good News!!

Voici une solution qui semble très bien fonctionner...
Je me demande pourquoi je n'y ai pas pensé plus tôt!!

SELECT m.* FROM Matiere m, Enseigner e  
WHERE m.IdMatiere=e.IdMatiere  
AND CreneauAnnee='2010/2011'  
AND (IdClasse=2 OR IdClasse=4)  
GROUP BY m.IdMatiere  
HAVING COUNT(m.IdMatiere)>1


Ceci ne renvoi que les valeurs en doublons et en un seul exemplaire en plus!

Il ne reste plus qu'à trouver un moyen de déterminer si la requète d'origine contient ou non des doublons...
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
331
Date d'inscription
dimanche 6 avril 2008
Statut
Membre
Dernière intervention
5 mai 2013
130
Suite nouveaux tests, je confirme que cette requète correspond en tout point à ce que je cherchais.

Je détermine si il y a des doublons avec du PHP (fonction mysql_num_rows sur la requète de base. Si >0, j'applique le même traitement à la requète 2. Si >0 j'utilise la requète 2 sinon j'utilise la requète 1).

Petit ajout cependant, en fonction nombre d'IdClasse (généré dynamiquement), le nombre du HAVING COUNT change pour se fixer à (Nombre d'IdClasse)-1. Normal, car pour être valide, une matiere doit apparaitre dans toutes les classes sélectionnées (le -1, c'est à cause du signe ">").

Voila! Je passe donc le sujet en résolu.

Merci à gaelyann pour son aide.
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
559
Date d'inscription
dimanche 21 février 2010
Statut
Membre
Dernière intervention
2 octobre 2010
51
ca doit etre un
SELECT attribut DISTINCT
FROM...
WHERE...

sinon, si tu veux selectionner tous les doublons et juste les doublons, tu peux tout simplement jouer avec le WHERE....
genre un
SELECT id DISTINCT
FROM USER_TABLE
WHERE id = {
ta selection
}
Messages postés
331
Date d'inscription
dimanche 6 avril 2008
Statut
Membre
Dernière intervention
5 mai 2013
130
Merci pour cette réponse.

J'avais déjà pensé au distinct mais cela ne supprime pas les valeurs qui ne sont pas en doublon.

Quant à la deuxième proposition, je ne la comprend pas.
Est-ce qu'il s'agit d'un requête imbriqué?
Messages postés
559
Date d'inscription
dimanche 21 février 2010
Statut
Membre
Dernière intervention
2 octobre 2010
51
en fait cest plus simple que ca....
requete 1 = toutes les tables
requete 2 = requete de tous les valeurs uniques
donc
requete 3 = requete de juste les doublond

donc requete 3 = requete 1 MINUS requete 2

le probleme cest requete 2 qui est un peu soulant...
il faut le faire avec un SELECT COUNT je pense....
genre un
SELECT ID
FROM USER_TABLE
WHERE {SELECT COUNT *
FROM USER TABLE
GROUP BY attribut } = 1
Messages postés
331
Date d'inscription
dimanche 6 avril 2008
Statut
Membre
Dernière intervention
5 mai 2013
130
Bon.

Le mieux est sans doute que je poste plus d'infos...

Tout d'abord, le MLD (enfin, le bout qui nous interesse):
Classe (IdClasse, IntituleClasse) 
Matiere (IdMatiere, IntituleMatiere) 
Enseigner (#IdMatiere, #IdClasse, CreneauAnnee)


Ensuite la requête actuelle:
SELECT m.* 
FROM Matiere m, Enseigner e 
WHERE m.IdMatiere=e.IdMatiere 
AND CreneauAnnee='2010/2011' 
AND (IdClasse=2 OR IdClasse=4 OR etc...)
----> cette partie est généré dynamiquement

Explications:
La table "Enseigner" contient la liste des matières associées à une classe pour un créneau spécifique.
Lorsque plusieurs classes sont spécifiés, seul les matières communes doivent apparaîtrent.
Messages postés
559
Date d'inscription
dimanche 21 février 2010
Statut
Membre
Dernière intervention
2 octobre 2010
51
ta essayer ce que jai dit plus haut?
genre ic ca doit donner un

SELECT m.*
from Matiere m, Enseigner e
where select count *
...........{from Matiere m, Enseigner e
............where Matiere.id = { SELECT m.*
............................................FROM Matiere m, Enseigner e
............................................WHERE m.IdMatiere=e.IdMatiere
............................................AND CreneauAnnee='2010/2011'
............................................AND (IdClasse=2 OR IdClasse=4 OR etc...)
.............................................}
............GROUP BY Matiere
............}
= 1

enfin je suis pas sur...ya peut etre un moyen plus simple....
Messages postés
331
Date d'inscription
dimanche 6 avril 2008
Statut
Membre
Dernière intervention
5 mai 2013
130
Désolé pour le retard. J'ai été très pris ses derniers jours.

Oui, j'ai tester ton code mais sa ne fonctionne pas ("You have an error in your SQL syntaxe...) au niveau de la 3ème imbrication apparamment...
J'ai fais quelques essais mais sans résultats.

Pourtant, ton idée me semble excellente, du moins en théorie.

Dans mon cas, je pense que je dois procéder ainsi (si j'ai des valeurs en double):
1. Faire ma requete normalement.
2. Faire ma requete avec un "select distinct".
3. Faire Requete 1 - Requete 2 (là encore, avec un "select distinct" au cas où une valeur serai présente plus de deux fois).

Comme sa, je retire une valeur de chaque et il ne reste que les doublons.

Cependant, il reste un problème:
Comment savoir quand il y a des doublons dans la requete 1?
Car je rappel que si il n'y en a pas, je ne dois renvoyer que la requete 1!
Enfin pour sa je vais surement arriver à me débrouiller en cherchant un peu.

Pour finir, j'avoue que je ne sais pas comment faire la 3ème partie en PHP ou en SQL...

Existe t-il des fonctions PHP capable de comparer des variables tableaux afin d'effectuer une soustraction? Ou peut-on le faire en SQL?

Je vais faire aussi des recherches de mon côté...