[mysql] recherche "distinct"

recherche "distinct" [mysql] - SQL/NoSQL - Programmation

Marsh Posté le 15-12-2005 à 11:50:27    

Bonjour tout le monde,
 
Je vais poser une question idiote, mais si je ne le fais pas je vais rester ignare toute ma vie :
Je souhaiterais enlever les doublons des résultats de ma requête. Je fais donc la requête suivante :

Code :
  1. SELECT DISTINCT nom_prod FROM mstore_produits WHERE (nom_prod LIKE 'whatever' OR desc_prod_fr LIKE 'whatever')


Cependant, j'aimerais retourner tous les champs des objets mstore_produits trouvés. Faut-il que je passe par une deuxième requête ou y a-t-il un moyen de le faire directement en une seule requête (du genre SELECT *, DISTINCT nom_prod ... je sais ça ne fonctionne pas).
 
Voila, merci d'avance.

Reply

Marsh Posté le 15-12-2005 à 11:50:27   

Reply

Marsh Posté le 15-12-2005 à 11:56:55    

bah tu rajoutes les champs que tu veux.
 
le distinct est une option qui s'applique à tous les champs du SELECT. Le requeteur va d'abord recuperer les enregistrements, et supprimer les doublons ensuite.


---------------
MZP est de retour
Reply

Marsh Posté le 15-12-2005 à 12:03:51    

cinocks a écrit :

bah tu rajoutes les champs que tu veux.
 
le distinct est une option qui s'applique à tous les champs du SELECT. Le requeteur va d'abord recuperer les enregistrements, et supprimer les doublons ensuite.


 
En fait je veux que le distinct ne s'applique qu'au champ nom_prod :/
Bon, je viens de lire que de toute façon la méthode "distinct" sent l'égout (dixit http://www.databasejournal.com/fea [...] hp/3437821 )
Pourquoi je me suis laissé embarquer dans les bases de données o_O

Reply

Marsh Posté le 15-12-2005 à 12:23:23    

les like c'est pire que les distinct, donc tu vas aussi nous faire le plaisir d'utiliser FULLTEXT SEARCH :p

Reply

Marsh Posté le 15-12-2005 à 12:26:06    

Arjuna a écrit :

les like c'est pire que les distinct, donc tu vas aussi nous faire le plaisir d'utiliser FULLTEXT SEARCH :p


 
damned ! ^^
bon OK je sors, je recherche et je reviens  :D

Reply

Marsh Posté le 15-12-2005 à 12:26:51    

va pas trop loin non plus, parceque les index sur texte, c'est quand même un peu compliqué, et ça résoudra pas forcément ton problème de distinct ;)

Reply

Marsh Posté le 15-12-2005 à 12:35:16    

Arjuna a écrit :

va pas trop loin non plus, parceque les index sur texte, c'est quand même un peu compliqué, et ça résoudra pas forcément ton problème de distinct ;)


 
hmm bon.. alors ça m'a l'air tout à fait passionnant, voir épanouissant comme sujet et je ne doute pas que je passerais un petit peu de temps dessus dès que mon boss arrêtera de me taper dessus ^^
 
Sinon, pour ma question du début, vous auriez des pistes à me donner ? une toute petite piste ? please ? s'il vous plait ?

Reply

Marsh Posté le 15-12-2005 à 12:36:21    

c'est quoi la question en fait ? parceque c'est pas clair :D

Reply

Marsh Posté le 15-12-2005 à 12:36:56    

y'a quoi dans ta base, tu veux trouver quoi ?

Reply

Marsh Posté le 15-12-2005 à 12:37:37    

gravastar_bureau a écrit :

En fait je veux que le distinct ne s'applique qu'au champ nom_prod :/
Bon, je viens de lire que de toute façon la méthode "distinct" sent l'égout (dixit http://www.databasejournal.com/fea [...] hp/3437821 )
Pourquoi je me suis laissé embarquer dans les bases de données o_O


 
Euh le distinct ne sent pas l'egout. Il a une fonction, c'est tout.  


---------------
MZP est de retour
Reply

Marsh Posté le 15-12-2005 à 12:37:37   

Reply

Marsh Posté le 15-12-2005 à 12:39:25    

comme le like : on s'en sert que si on est menacé de malédiction sur les 10 génération à venir par un nain voodoo venant de l'espace :o

Reply

Marsh Posté le 15-12-2005 à 12:40:39    

le like, la commande qui depanne quand on cherche quelque chose, mais que l'on ne doit jamais voir dans un script :lol:
 


---------------
MZP est de retour
Reply

Marsh Posté le 15-12-2005 à 12:47:30    

Arjuna a écrit :

y'a quoi dans ta base, tu veux trouver quoi ?


 
Alors, dans ma base j'ai la table mstore_produits sur laquelle je fais mes tests pour trouver mes instances (si je dis un mot de travers tapez pas trop fort, c'est parce qu'à la base ce n'est pas tout à fait mon domaine).
 
mstore_produits
ref_prod
nom_prod
desc_prod
url_photo
prix
ref_categorie
modele
date_ajout
stock
promo
theme
prix_vert
valid
delai_livraison
ref_constructeur
 
Nous avons déjà un "moteur de recherche" (riez pas trop fort, la personne qui a programmé ça n'est pas là et il ne faut pas se moquer des absents) qui renvoie toutes les instances correspondant (soit dans nom_prod, soit dans desc_prod) à la chaine de caractères entrée. Ce que l'on m'a demandé de faire c'est d'enlever les doublons (et d'améliorer la présentation, ça c'est mon travail) retournés par ce moteur.
Le moyen d'enlever les doublons pour moi c'était de faire un distinct sur le champ nom_prod.
Ce que je dois retourner c'est des instances de la table mstore_produits (tous les champs quoi) correspondant à la recherche.
 
Ai-je été plus clair ?

Reply

Marsh Posté le 15-12-2005 à 13:20:54    

tu ne veux pas que nom produit soit present plus d'une fois


---------------
MZP est de retour
Reply

Marsh Posté le 15-12-2005 à 13:31:24    

Arjuna a écrit :

comme le like : on s'en sert que si on est menacé de malédiction sur les 10 génération à venir par un nain voodoo venant de l'espace :o


 
n'importe quoi... il y a des cas (rare mais ils existent) ou le distinct est absolument obligatoire...


---------------
Hobby eien /人◕ ‿‿ ◕人\
Reply

Marsh Posté le 15-12-2005 à 14:01:38    

gravastar_ bureau > arrête pas parler "d'instances", parle de "produits", puisque c'est ce que tu as dans ta table. ça au moins ça parle à tout le monde, même à un enfant de 6 ans ;)
sinon, si je comprends bien, le moteur actuellement renvoie plusieurs références produit différentes, qui ont le même nom de produit.
 
c'est bien ça ?
si c'est ça, alors c'est là qu'il faut creuser un peu : c'est pas normal.
 
ensuite, tu fais quoi si t'as un produit "PRD1" et un produit "PRD2" qui s'appelle tous les deux "mon produit" ? tu décides comment duquel afficher ?

Reply

Marsh Posté le 15-12-2005 à 14:04:01    

Tamahome > ben justement, la menace de se faire désintégrer par un nain voodoo venu de l'espace est un des rares cas où il est autorisé d'utiliser distinct.
 
Pour le reste, c'est à éviter comme la peste.
 
En gros, t'imagine que le "distinct" et le "like" c'est une ligne blanche continue.
Ben en voiture, t'as pas le droit de la franchir de ton propre gré. mais si un gibiers se lance sous tes roues, ou qu'un ovni se pose devant toi, là t'as le droit de faire un écart sur la voie d'en face. :spamafote:

Reply

Marsh Posté le 15-12-2005 à 14:04:56    

tu as bu ?


---------------
Hobby eien /人◕ ‿‿ ◕人\
Reply

Marsh Posté le 15-12-2005 à 14:19:45    

bah nan, je m'escrime à faire des modèles de données correct, et à les exploiter correctement, plutôt que d'utiliser des parades de sagouin pour pallier à un manque de réflexion.

Reply

Marsh Posté le 15-12-2005 à 14:23:01    

j'oubliais : le "IN" est à mettre dans le même panier que le "DISTINCT" et le "LIKE". Le "IN", c'est même pire, puisqu'avec l'accroissement en taille de la base, une requête qui marchait très bien un jour va lamantablement planter le lendemain, de façon totalement alléatoire, parcequ'en certaines circonstances on aura dépassé le nombre maximal d'occurences acceptées par la clause "IN" (créfieu c'est de la bonne celle-là, ça me rappelle de bons souvenirs de nuits blanches en charmante compagnie - j'avais un jolie petit brin de stagiaire toute mimi pour m'aider à comprendre pourquoi la procédure de réplication d'une base plantait certaine nuits et pas d'autres :heink:)

Reply

Marsh Posté le 15-12-2005 à 14:46:19    

Je resume ce que je sais :
DISTINCT : -> souvent utilisé a tort, dans 90% des cas on peut l'eviter en construisant autrement sa requete. JAMAIS une requete n'est plus performante avec un distinct qu'avec une autre solution...
 
LIKE: -> sur des requetes multicritères parfois inévitables et dans la plupart des SGBD n'utilise pas les indexs, a fuire aussi sauf obligation (il est d'ailleurs conseillé souvent de faire une requete dynamique avec un = ou un LIKE en fonction du nombre de critère (1 ou +) car le parsing est plus avantageux que la non utilisation de l'index, enfin surtout sur des gros volumes de données....)
 
IN : A remplacer par EXISTS systématiquement avec une auto-jointure et très souvent sans ... Le pourquoi du comment est un peu long a expliquer ici...J'essaierai de retrouver un article si ca interesse quelqu'un...


Message édité par belldandys le 15-12-2005 à 16:02:25
Reply

Marsh Posté le 15-12-2005 à 14:46:45    

Arjuna a écrit :

si je comprends bien, le moteur actuellement renvoie plusieurs références produit différentes, qui ont le même nom de produit.
 
c'est bien ça ?
si c'est ça, alors c'est là qu'il faut creuser un peu : c'est pas normal.
 
ensuite, tu fais quoi si t'as un produit "PRD1" et un produit "PRD2" qui s'appelle tous les deux "mon produit" ? tu décides comment duquel afficher ?


 
Alors c'est bien ça, pour le moment le moteur renvoie plusieurs produits qui ont le meme nom, car il s'agit d'un produit compatible avec plusieurs modèles de GSM (puisque c'est ce dont il s'agit). De ce côté-là, vu que ce n'est pas sensé être mon travail, je ne vais pas pouvoir creuser trop profondément.
 
Pour ce qui est de tes 2 produits "PRD1" et "PRD2", la réponse est au-dessus, en fait il s'agit du même produit.
 
Un embryon de piste pour éviter la double requête ?

Reply

Marsh Posté le 15-12-2005 à 14:52:19    

de toute façon, là j'ai un bonhomme noir et rose à côté de moi qui tiens un objets étrange et menançant, donc j'ai le droit d'écrire :
 


select distinct truc from chouette where machin in (select chose from bidule where jeronimo like '%' + machin.goldorak + '%')


 
ha nan, c'est le comptable qui venait me serrer la main.

Reply

Marsh Posté le 15-12-2005 à 14:53:43    

gravastar_bureau a écrit :

Alors c'est bien ça, pour le moment le moteur renvoie plusieurs produits qui ont le meme nom, car il s'agit d'un produit compatible avec plusieurs modèles de GSM (puisque c'est ce dont il s'agit). De ce côté-là, vu que ce n'est pas sensé être mon travail, je ne vais pas pouvoir creuser trop profondément.
 
Pour ce qui est de tes 2 produits "PRD1" et "PRD2", la réponse est au-dessus, en fait il s'agit du même produit.
 
Un embryon de piste pour éviter la double requête ?


ben oui, mais tu retournes quelle reférence dans ce cas alors ?
 
à mon avis, tu retournes trop de champs dans ta requête, c'est pour ça que ça merde.

Reply

Marsh Posté le 15-12-2005 à 15:01:54    

Arjuna a écrit :

ben oui, mais tu retournes quelle reférence dans ce cas alors ?
 
à mon avis, tu retournes trop de champs dans ta requête, c'est pour ça que ça merde.


 
Je retourne le produit sans préciser sa compatibilité sur cette page. Après, dans sa fiche produit, ses compatibilités seront listées.
 
Bon, je vais m'en sortir en fait, mais j'aurais aimé savoir s'il était possible de retourner tous les champs d'une table en évitant les doublons, en se basant uniquement sur un champ. Ca n'est pas forcement logique de faire quelque chose comme ça si la base est bien conçue, mais bon ^^

Reply

Marsh Posté le 15-12-2005 à 15:08:00    

ben nan, c'est pas possible.
 
sinon, je répète la question : quand t'as un doublon sur ton champ, comment choisis-tu quelle ligne retenir plutôt que telle autre ?
 
un exemple :
 
Voici une table représentant l'arche de Noé (je dois me faire bâtiser, alors je révise)


bestilole  couleur
--------------
lapin    blanc
loup    gris
lapin   rose
loup    gris


 
select distinct bestilole, couleur from arche_de_noe
 
Ca donne :


bestilole  couleur
--------------
lapin    blanc
loup    gris
lapin   rose


 
OK, on a trouvé deux loup gris, donc on en a balancé un à l'eau.
Mais il reste deux lapins... Seulement, je balance lequel ? Le blanc ou le rose ? Ca, le SGBD il ne peut pas choisir à ta place. Il faut faut donc modifier ta requête pour lui dire sur quoi se baser pour discriminer les bestioles.

Message cité 1 fois
Message édité par Arjuna le 15-12-2005 à 15:08:25
Reply

Marsh Posté le 15-12-2005 à 15:09:28    

y'a un p à baptiser :o


---------------
Hobby eien /人◕ ‿‿ ◕人\
Reply

Marsh Posté le 15-12-2005 à 15:22:16    

moi je préfère l'écrire avec un "â" ça fait penser à âne bâté :p

Reply

Marsh Posté le 15-12-2005 à 15:36:24    

Arjuna a écrit :

Voici une table représentant l'arche de Noé (je dois me faire bâtiser, alors je révise)


bestilole  couleur
--------------
lapin    blanc
loup    gris
lapin   rose
loup    gris


 
select distinct bestilole, couleur from arche_de_noe
 
Ca donne :


bestilole  couleur
--------------
lapin    blanc
loup    gris
lapin   rose


 
OK, on a trouvé deux loup gris, donc on en a balancé un à l'eau.
Mais il reste deux lapins... Seulement, je balance lequel ? Le blanc ou le rose ? Ca, le SGBD il ne peut pas choisir à ta place. Il faut faut donc modifier ta requête pour lui dire sur quoi se baser pour discriminer les bestioles.


 
Quel lapin choisir, je te dirais qu'en ce qui me concerne la chose importante est qu'il s'agisse d'un lapin.. après sa couleur m'importe peu.

Reply

Marsh Posté le 15-12-2005 à 15:41:10    

donc, on est d'accord.
donc si tu vires la couleur de ta requête, t'aura plus de problème.
 
idem pour ta requête : si avec un distinct t'as encore des doublons, alors c'est que tu retournes un champ discriminant dont tu te moques : vire-le !

Reply

Marsh Posté le 15-12-2005 à 15:41:27    

dans ce cas, pourquoi recuperer le champ sur la couleur?

Message cité 1 fois
Message édité par cinocks le 15-12-2005 à 15:41:33

---------------
MZP est de retour
Reply

Marsh Posté le 15-12-2005 à 15:41:44    

grillaide, nananère :p

Reply

Marsh Posté le 15-12-2005 à 16:01:04    

cinocks a écrit :

dans ce cas, pourquoi recuperer le champ sur la couleur?


 
Vous avez tout à fait raison, je voulais récupérer toutes les infos relatives aux produits à afficher pour ne pas dépayser la personne qui a fait ce script. Comme la base et l'ensemble des requêtes faites sur ce site me semblent louches, je ne veux pas tout changer o_O

Reply

Marsh Posté le 15-12-2005 à 16:09:33    

Arjuna a écrit :

grillaide, nananère :p


oui :( :cry:


---------------
MZP est de retour
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed