comment faire un SELECT DISTINCT en ayant plusieurs champs? [ASP][SQL] - Programmation
Marsh Posté le 06-09-2001 à 15:03:09
si je fais :
sql = "SELECT DISTINCT mail,prenom,nom FROM liste WHERE mail LIKE '%@%'"
ça me renvois toute la liste
[edtdd]--Message édité par duch--[/edtdd]
Marsh Posté le 06-09-2001 à 15:05:45
Bah c logique ! Si tu lui demande de te renvoyer tous les groupes (nom,prenom,email) different l'un de l'autre, c normal qu'il te renvoit toute les lignes puisqu'elle doivent toutes etre differente sur au moins un des champs !
Kes ke tu veux faire exactement ?
Marsh Posté le 06-09-2001 à 15:07:01
bah je veux une liste tous les gens dont les mails sont uniques, mais je peux qd même pouvoir récupérer leur nom et leur prénom, c'est tout.
Marsh Posté le 06-09-2001 à 15:09:47
sinon, y'a la méthode barbare, je fais d'abord un select distinct sur les mails, et ensuite je fais une autre requête avec une clause WHERE mail = "&rs.fields("mail" ).value
mais y'a sans dout plus propre non?
Marsh Posté le 06-09-2001 à 15:13:36
Bah ca doit marcher normallement : "SELECT DISTINCT mail,prenom,nom FROM liste"
Marsh Posté le 06-09-2001 à 15:16:31
bah non ça marche pas, ça me renvois plus d'enregistrement qd je fais
sql = "SELECT DISTINCT mail,prenom,nom FROM liste WHERE mail LIKE '%@%'"
que qd je fais
sql = "SELECT DISTINCT mail FROM liste WHERE mail LIKE '%@%'"
c'est pô ça que je veux, moi je veux le même nb d'enregistrements
renvois moi tous les champs ou mail est unique mais je veux qd même nom et prénom.
Marsh Posté le 06-09-2001 à 15:45:58
Tu peux toujours faire ta requête selectionnant le mail, le nom et le prenom et trier en ASP à défaut de pouvoir utiliser DISTINCT... NON ???
[edtdd]--Message édité par fly lm--[/edtdd]
Marsh Posté le 06-09-2001 à 15:53:29
bah quand tu fais
select distinct nom,email from machin
=> s'il ya deux noms différents mais qui ont le même email ça va sortir deux lignes. LOGIQUE non ? Comment tu fais à la main ?
DISTINCT ici veut dire s'il ya deux lignes qui ont même nom et même email eh bah ça sort 1 seule ligne
Marsh Posté le 06-09-2001 à 15:58:01
merci de me répeter 20 fois la même chose mais j'avais compris
si DISTINCT ne fonctionne pas pour ça quelle instruvtion pourrait fonctionner ?
Marsh Posté le 06-09-2001 à 16:01:21
duch a écrit a écrit : merci de me répeter 20 fois la même chose mais j'avais compris si DISTINCT ne fonctionne pas pour ça quelle instruvtion pourrait fonctionner ? |
Tu peux faire le trie en ASP, facile NON ???
Marsh Posté le 06-09-2001 à 16:03:06
bon ben si y'a pas d'autre moyen, je prendrais la méthode bourrin
Marsh Posté le 06-09-2001 à 16:05:53
Je comprends pas ton problème. Je comprends les solutions proposées, mais vu la question que tu poses enfin bref TU POURRAIS PAS DONNER UN EXEMPLE???
Marsh Posté le 06-09-2001 à 16:09:02
C'est pas si bourrin que ça, je sais ce serait mieux d'avoir directement le résultat en SQL... J'ai essayer de jouer avec DISTINCT mais comme toi ca fait pas ce qu'on attends et c'est normal, je trouve pas...Mais si tu fais une première requête en triant par mail, c'est d'autant plus simple pour ensuite refaire un trie en ASP (quoique l'ASP, connait pas bien...)...
@+
Marsh Posté le 06-09-2001 à 16:14:29
SELECT mail,prenom,nom FROM liste WHERE mail LIKE '%@%'" GROUP BY mail,prenom,nom
Marsh Posté le 07-09-2001 à 10:08:45
Pour Infos, le DISTINCT est extrêment gourmand en ressource !!
Marsh Posté le 20-10-2008 à 16:13:46
Il est pourtant clair son problème.
Vous avez un fichier qui contient plusieurs rubriques :
[ ID ] [ CODE ] [ LIBELLE ]
1 A LIBELLE1
2 B LIBELLE2
3 C LIBELLE3
4 A LIBELLE4
5 A LIBELLE5
6 D LIBELLE6
Ce qu'il veut, c'est faire un distinct sur le CODE, tout en ayant accès aux rubriques.
Chose impossible en SQL avec distinct.
La solution est d'utiliser le groupe by
Ex:
select ID,CODE,LIBELLE from FICHIER where ... GROUP BY CODE
De cette manière la requète permet de faire Requète.ID ou Requète.CODE, etc...
Et le résultat retourné serra le suivant :
1 A LIBELLE1
2 B LIBELLE2
3 C LIBELLE3
6 D LIBELLE6
Marsh Posté le 20-10-2008 à 17:00:55
heureusement que tu es là, il aura quand même attendu 7 ans avant d'avoir la réponse
edit : et sinon, ta requête elle fonctionne pas
Marsh Posté le 21-10-2008 à 17:51:40
Ca servira au prochain qui se posait la question ^^
C'est à dire comme moi il y a quelques jours...
ps: je ne vois le problème de ma requète... ^^ si c'est à cause des "..." à vous d'adapter.
Marsh Posté le 21-10-2008 à 18:13:35
ta requête ne fonctionne pas car elle renvoie tout le contenu de la table : pour chaque code tu auras tous les ID et tous les libellés, donc tout.
Et enrichir la clause where n'y changera rien, à moins de filtrer avec une liste explicite de libellés ou d'ID, ce qui n'a plus aucun intérêt.
De plus, la question posée par l'auteur du topic n'est vraiment pas claire.
je peux avoir plusieurs fois le même mail
je veux une liste tous les gens dont les mails sont uniques, mais je peux qd même pouvoir récupérer leur nom et leur prénom
En fait, il veut un seul enregistrement par mail alors qu'un mail peut être associé à plusieurs couples nom/prénom. Ce qui est tout à fait impossible à moins de n'en choisir qu'un de façon arbitraire (un min(NOM) ???)
Bref, si personne n'a proposé de solution correcte ici, c'est que le problème n'a jamais été exposé clairement
Marsh Posté le 22-10-2008 à 07:46:40
ReplyMarsh Posté le 21-11-2008 à 14:20:29
tet2neu : "ta requête ne fonctionne pas car elle renvoie tout le contenu de la table : pour chaque code tu auras tous les ID et tous les libellés, donc tout."
Heu... je rappel quand même la question initiale de duch:
"le blème c'est que comme ça je ne récupère que "mail" dans mon rs, or j'aimerais avoir le contenu des autres champs, mais j'y arrive pô, comment kon fait?"
Je traduis donc pour ceux qui ne savent pas lire...
-> Je souhaite effectuer un distinct sur une rubrique tout en ayant acces à TOUS les autres champs.
Je remets donc la solution (qui fonctionne très bien):
select ID,CODE,LIBELLE from FICHIER where ... GROUP BY CODE
Par conséquent : Oui, ionik. ^^
Marsh Posté le 21-11-2008 à 14:24:17
"non et STOP !"
ps1 : le titre en dessous de ton pseudo te scier à ravir.
ps2 : si Ionik pose la question, c'est que le sujet est toujours utile.
Marsh Posté le 21-11-2008 à 17:02:37
pour info :
- Sarah Bloothicket et Ionik : tout ce que feront vos requetes, c'est retourner une erreur du genre "id et libelle n'est pas valide car elle ne sont pas contenues dans une fonction d'aggregation ou dans la clause GROUP BY"
donc, il faut rectifier votre requete comme ceci :
select ID,CODE,LIBELLE from FICHIER where ... GROUP BY ID, CODE, LIBELLE
- une fois rectifiée de la sorte, on exécute la requete, et on s'aperçoit que toutes les lignes sont retournées. pourquoi ? parce que que les libellés sont différents en face des codes. comment voulez vous regrouper par exemple les lignes 1 et 4 sous le code A alors que la valeur du libellé est différente ?
faire un GROUP BY dans un SELECT qui ne possède aucune fonction d'agrégation revient à faire un SELECT DISTINCT. donc, Sarah Bloodthicket, merci de ne pas soutenir que ta requête fonctionne alors que ce n'est pas du tout le cas.
Marsh Posté le 21-11-2008 à 18:20:47
Sarah Bloodthicket a écrit : tet2neu : "ta requête ne fonctionne pas car elle renvoie tout le contenu de la table : pour chaque code tu auras tous les ID et tous les libellés, donc tout." Heu... je rappel quand même la question initiale de duch: "le blème c'est que comme ça je ne récupère que "mail" dans mon rs, or j'aimerais avoir le contenu des autres champs, mais j'y arrive pô, comment kon fait?" Je traduis donc pour ceux qui ne savent pas lire... Je remets donc la solution (qui fonctionne très bien): Par conséquent : Oui, ionik. ^^ |
re "non"
quand je dis que la requête ramène toute la table je ne parle pas du nombre de colonnes mais du nombre de ligne. Bref, la requête ne fait aucun distinct.
Dans ton exemple, soit le SGBD ramène tout le contenu de la table (donc aucun DISTINCT), soit la requête plante lamentablement (ce dont parle Harko). En aucun cas le résultat ne sera celui que tu donnes.
Et "stop" parce que la question est tellement peu claire qu'aucune solution acceptable ne peut être donnée.
Marsh Posté le 25-11-2008 à 15:38:06
Citation : Sarah Bloodthicket, merci de ne pas soutenir que ta requête fonctionne alors que ce n'est pas du tout le cas. |
Heuu... si je me suis permis de poster ici, c'est parcque j'ai rencontré ce problème et que je pense avoir trouvé une solution.
Ce n'est pas mon genre de poster des solutions à la con. Mais qui sait? personne n'est parfait hein?
Donc dans le doute... je suis retourné dans mon code et j'ai vérifié...et vérifié... et vérifié encore.
He ben désolé d'insister lourdement (n'en déplaise à certain), mais chez moi sa fonctionne.
J'ai environ 1500 articles parmis lesquels je peux avoir des doublons sur le CODE puisqu' un même article peut exister en dépense et en recette.
exemple:
[CODE] [LIB] [SENS]
205 article1 D
205 article1 R
2111 article2 D
2111 article2 R
2183 article3 D
2183 article3 R
Mon objectif était d'afficher la liste des articles existant, mais sans les doublons puisque dans le même fichier j'ai un enregistrement pour Dépenses et Recettes.
J'ai donc fait la requète suivante:
"select CODE, LIB from FICHIER where group by CODE".
Citation : tout ce que feront vos requetes, c'est retourner une erreur du genre "id et libelle n'est pas valide car elle ne sont pas contenues dans une fonction d'aggregation ou dans la clause GROUP BY" |
Bah non...désolé de faire mon gros lourd, mais pas chez moi.
Chez moi ça me retourne ça :
[CODE] [LIB]
205 article1
2111 article2
2183 article3
Reproduit sur une requète SQL en Windev12.
Je ne soutiens donc pas que ça fonctionne chez tout le monde, je dis juste que chez moi ça donne sa. Vlà.
Marsh Posté le 25-11-2008 à 15:42:18
Exact copier coller du code :
"select ivb12_art, ivb12_artlib from bu_ivb12_m4xa where idbu_maquette = "+Oglobal:N_idbu_maquette+" and IVB12_SECTION="+FIV_B12.SEL_SECTION+" group by ivb12_art"
Seule différence: 2 malheureuses conditions dans le where
Marsh Posté le 25-11-2008 à 19:36:30
J'ai bien compris que ton intention en postant ici était d'aider en partageant ton expérience. Rien de mal à cela, mais je ne peux pas te laisser dire que ta solution est bonne.
Encore une fois, la requête que tu proposes n'est pas correcte.
Lorsque tu fais un group by, tu dois retrouver dans ton select à la fois l'ensemble des champs composant le group by, et des fonctions d'agrégat comme count(), min(), max, sum() sur les autres champs...
Et rien d'autre.
Regardons, afin d'être plus clair, le problème initialement posé sur ce topic.
Nous avons une table qui contient des ensembles NOM / PRENOM / E-MAIL
On peut retrouver dans cette table le même e-mail avec des couples nom/prenom différents.
NOM / PRENOM / MAIL
Dupond / Jacques / jacquesd@hfr.fr
Dupont / Jacques / jacquesd@hfr.fr
Durand / Maurice / mauriced@clubic.com
La question posée est "comment récupérer les e-mail distinct, mais aussi les noms et prénoms"
je veux donc récupérer une seule fois "jacquesd@hfr.fr" mais je voudrais aussi le nom et le prénoms qui correspondent.
Or il y a 2 noms disponibles. Tu vois bien que nous avons un problème. Lequel récupérer ? On en a aucune idée puisque l'auteur du sujet n'a jamais donné de détail.
Deuxième problème.
La requête que tu proposes, appliquée à notre exemple donnerai :
Code :
|
Si je teste cette requête sous sysbase, elle semble fonctionner. Mais le résultat est le suivant :
Dupond / Jacques / jacquesd@hfr.fr
Dupont / Jacques / jacquesd@hfr.fr
Durand / Maurice / mauriced@clubic.com
Donc en gros, le group by n'a servi à rien du tout. Pourquoi ? Parce que pour l'e-mail jacquesd@hfr.fr je dispose de 2 couples nom/prénom et que je ne dis pas à ma requête lequel choisir. Donc il sort les 2.
Si je teste cette requête sous Oracle, elle plante !
Pourquoi ? Parce que les champs NOM et PRENOM de mon select ne font pas partie du group by ET aucune fonction d'agrégat ne leur est associé.
Maintenant, et pour éviter que tu me prennes pour un con encore une fois en répétant "ma requête fonctionne très bien, regarde, avec ça ça marche !", regardons ton exemple de plus près.
Passons outre le fait que, syntaxiquement, ta requête pourra être rejetée par certains SGBD. Visiblement, pour le tiens, ça passe.
Concentrons nous sur le résultat.
Tu sélectionnes le code et le libellé, tu regroupes sur le codes, et tu obtiens bien la liste distincte des couples CODE/LIB.
Et bien vois-tu, rien d'anormal dans la mesure où dans ta tables, tu ne retrouves jamais 2 fois le même code avec 2 libellés différents.
On est donc pas du tout dans le cas du problème posé ici avec un e-mail associé avec 2 noms différents.
Dans ton cas, tu aurais dû faire la requête suivante select distinct CODE, LIB from FICHIER where ...
Le résultat aurait été identique et la requête correcte.
En conclusion, il ne s'agit pas de s'acharner sur toi par pure méchanceté. J'insiste sur le fait que ta requête est incorrecte. Elle ne respecte pas l'utilisation normale du group by.
J'espère avoir été un peu plus clair.
Marsh Posté le 25-11-2008 à 21:20:27
Sarah Bloodthicket a écrit : [quote] |
Bon, on va prendre le problème depuis le début : c'est quoi le SGBD que tu utilises ? parce qu'un SGBD qui ne gueule pas quand un GROUP BY est incomplet, j'en ai jamais vu (et j'en ai vu !)
Même cette grosse bouse d'Access plante avec ça...
Pour le reste, tet2neu a tout dit.
Marsh Posté le 25-11-2008 à 21:22:01
il me semble que sous sybase ASE ça plantait pas. Mais ça remonte un peu
Marsh Posté le 26-11-2008 à 13:31:46
Bon, he bien déjà merci pour cette réponse plus détaillée que les précédentes.
Citation : Dans ton cas, tu aurais dû faire la requête suivante select distinct CODE, LIB from FICHIER where ... |
He bien pas exactement, puisque j'ai eu le même soucis que Duch : avec un select distinct je n'arrivais pas à afficher toutes les rubriques de ma table tout en faisant le distinct (sur le code uniquement) en une seule requète. (obligé d'en faire 2).
Après il y a peut-etre une solution, mais je la connais pas.
Citation : Elle ne respecte pas l'utilisation normale du group by. J'espère avoir été un peu plus clair. |
Tout à fait! En gros, ça fonctionne dans mon cas, mais ça ne devrait pas.
Ce qui est bon à savoir puisqu'il est possible que je passe bientôt en oracle.
Citation : Bon, on va prendre le problème depuis le début : c'est quoi le SGBD que tu utilises ? |
Je suis en Hyperfile Client/Serveur.
La requète ne plante pas non plus lorsqu'elle est entrée "en test" directement dans le Centre de contrôle Hyperfile.
Même comportement : il me retourne à chaque fois les enregistrements filtrés sur le code.
Citation : tu ne retrouves jamais 2 fois le même code avec 2 libellés différents |
Oui et non. Je complète un peu ma table :
[Code] [Libellé] [Sens] [Libellé Service]
001 Libellé 001 D Service A
001 Libellé 001 R Service B
002 Libellé 002 D Service C
...
Dans ma table, il se pourrait cependant qu'il y ai des Libellés différents sur le Service.
Dans ce cas, ma requète semble sélectionner un des libellés au pif (chose qui dans mon cas ne me dérange pas).
Citation : Je veux donc récupérer une seule fois "jacquesd@hfr.fr" mais je voudrais aussi le nom et le prénoms qui correspondent. |
J'en reviens donc à ça :
Citation : Dans ce cas, ma requète semble sélectionner un des libellés au pif |
C'est peut-etre ce qu'il souhaitait après tout?
Dans ce cas ma réponse n'aurait pas été si stupide que ça... sauf que comme vous l'expliquez au dessus, elle n'est pas censée fonctionner sans renseigner le group by. Et en SQL je vous fais confiance, ce n'est pas mon domaine préféré
Donc la dessus, je m'incline...
Marsh Posté le 26-11-2008 à 14:10:55
Citation : Dans ce cas, ma requète semble sélectionner un des libellés au pif (chose qui dans mon cas ne me dérange pas). |
Autant pour moi, j'avais une 2e procédure bien planquée qui se chargait de rapatrier le service...
Marsh Posté le 26-11-2008 à 15:30:50
Ah oui
Parce que si ton SGBD se met à choisir de son propre chef les enregistrements qui l'intéressent, c'est encore pire que ce que j'imaginais
Pour le DISTINCT, effectivement, si tu as d'autres champs derrière ça ne fonctionne pas
Marsh Posté le 03-12-2008 à 19:12:29
Bon pour rencontrer le même problème que le membre qui à posté la question initialement je comprend tout à fait sa question.
Je vais essayer de la reformuler :
Dans ma BDD il peut arriver que plusieurs entré ait le même champ A.
Or je ne veut sélectionner qu'une seul entré par champ A. (que ça me donne uniquement des champs A différent quoi)
Mais pour compliquer un peu les entrés dont le champ A est identique peuvent avoir trois autres champs de différent entre eux. (comme dans l'exemple ou plusieurs noms sont associés à seule une adresse email)
Peu m'importe comment ils sont choisis (aléatoirement par exemple) mais je préférais que l'entrée qui sera affiché parmi celle qui ont le même champ A soir celle pour qui la valeur du champ B serait la plus petite.
Donc comment dois-je faire?
(en php sous mysql)
Merci !
Marsh Posté le 08-01-2009 à 10:42:45
Exemple:
[CODE] [LIB] [SENS]
205 article1 D
205 article1 R
2111 article2 D
2111 article2 R
2183 article3 D
2183 article3 R
requète :
"select CODE, min(LIB) LIB from FICHIER group by CODE".
et ça me retourne ça : (Oracle 9)
[CODE] [LIB]
205 article1
2111 article2
2183 article3
Marsh Posté le 17-07-2009 à 14:43:22
J'ai un problème de selection avec un distinct qui ne veut pas faire ce que je voudrais.
N'étant pas un virtuose de la BDD et après une recherche sur le net je suis arrivé sur ce poste qui ne date pas d'hier Donc, je me suis
permis de poster mon souci ici en espèrant que quelqu'un veuille bien m'aider.
J'ai une table produit dans une base de données access qui est composée des champs suivant :
Tout les champs ne sont pas représentés ici (trop nombreux)
Numéro, Code_Article, Désignation_Article, Code_Rayon, Désignation_Rayon, Code_Famille, Désignation_Famille, Code_S_Famille, Désignation_S_Famille, Code_Fournisseur, Nom_Fournisseur, Libelle_de_la_Taille, Code_Couleur, Désignation_Couleur, Code_Fabricant, Désignation_Fabricant, Prix_Vente_TTC
...., etc.
Je voudrais imprimer une étiquette générique par produit (sur cette étiquette doit figurer plusieurs champs)
Je prends par exemple parmit tous les produits de la table des chaussures qui ont les même données dans tous les champs sauf pour les champs taille et couleur ( ces deux champs ne figurent pas sur l'étiquette)
(extrait de la table produit)
Num CodeArt DésignArt DésignRayon DésignFam DésignSFam NFour Taille DésignCoul DésignFabr Prix
07 00153 Chauhiver Chaussures Chaussons Velcros ANDREA 32 Noir Andrea 115,00
08 00153 Chauhiver Chaussures Chaussons Velcros ANDREA 32.5 Marron Andrea 115,00
09 00153 Chauhiver Chaussures Chaussons Velcros ANDREA 33 Vert Andrea 115,00
10 00153 Chauhiver Chaussures Chaussons Velcros ANDREA 33.5 Rouge Andrea 115,00
11 00153 Chauhiver Chaussures Chaussons Velcros ANDREA 34 Blanc Andrea 115,00
37 00154 Chauhiver Chaussures Chaussons Enfants ANDREA 26 Marron Andrea 41,00
38 00154 Chauhiver Chaussures Chaussons Enfants ANDREA 27 Vert Andrea 41,00
48 00157 Chauhiver Chaussures Chaussons Lacets ANDREA 32 Rouge Andrea 108,00
49 00157 Chauhiver Chaussures Chaussons Lacets ANDREA 32.5 Noir Andrea 108,00
50 00157 Chauhiver Chaussures Chaussons Lacets ANDREA 33 Noir Andrea 108,00
78 00162 Chauhiver Chaussures Chaussons Velcros BORÉAL 2 UK Vert Boréal 78,90
79 00162 Chauhiver Chaussures Chaussons Velcros BORÉAL 2.5 UK Vert Boréal 78,90
80 00162 Chauhiver Chaussures Chaussons Velcros BORÉAL 3 UK Vert Boréal 78,90
J'ai essayé ceci "SELECT DISTINCT Code_Article FROM produit"
Mais ca ne me sort que le code article alors que je voudrais avoir plusieurs champ d'inscris sur mon étiquette.
Si cela était possible j'aurais aimé quelque chose comme çà ( mais ce ne marche pas!) "SELECT (DISTINCT Code_Article), champ1, champ2, champ3, etc... FROM produits" ou ceci "SELECT (DISTINCT Code_Article), * FROM produits"
j'ai essayé ceci également "SELECT DISTINCT Code_Article, champ1, champ2, champ3 FROM produit" mais ca me renvoi pas tout comme je le voudrais.
pour avoir comme résultat ( par exemple) une étiquette unique du genre :
Num CodeArt DésignArt DésignRayon DésignFam DésignSFam NFour Taille DésignCoul DésignFabr Prix
10 00153 Chaushiver Chaussures Chaussons Velcros MARTIN 32 Bleu MARTIN JO 115,00
38 00154 Chaushiver Chaussures Chaussons Enfants ANDREA 33 Vert Andrea 41,00
50 00157 Chaushiver Chaussures Chaussons Lacets ANDREA 33 Noir Andrea 108,00
78 00162 Chaushiver Chaussures Chaussons Velcros BORÉAL 2 UK Vert Boréal 78,90
Le produit choisi dans le select distinct code_article m'importe peut car les champs sont presque tous identique et ceux qui sont différent ne me servent pas.
Si quelqu'un a une idée?
Merci d'avance
Marsh Posté le 06-09-2001 à 14:49:04
dans une table je peux avoir plusieurs fois le même mail, donc pour récupérer une liste de mail unique je fais :
sql = "SELECT DISTINCT mail FROM liste WHERE mail LIKE '%@%'"
le blème c'est que comme ça je ne récupère que "mail" dans mon rs, or j'aimerais avoir le contenu des autres champs, mais j'y arrive pô, comment kon fait?