|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Invité régulier
![]() Inscription : septembre 2007 Messages : 13 ![]() |
Bonjour,
Je suis novice en SQL et je tente de faire quelque chose qui dépasse mes compétences, alors si une âme charitable peut m'aider, elle sera la bienvenue. Je cherche à faire une sélection de produits à partir de leurs caractéristiques. Dans une première table, j'ai mes produits (version simplifiée) : Code :
Code :
Par exemple : - Type = Type1 ET - Marque = MarqueA OU MarqueB ET - Caractéristiques : Caract1 = 10 ET Caract3 = 30 Ce qui doit me donner les produits 1 et 3. En un mot : je fais comment ? Merci pour votre aide. Hervé. |
||||
|
|
00
|
|
|
#2 |
![]() ![]() ![]() Cédric DuprezInscription : avril 2002 Messages : 3 823 ![]() |
Bonjour,
Une simple jointure entre les 2 tables sur id_prod, puis les différentes conditions à remplir dans le WHERE, le tout avec un petit DISTINCT en début de requête devrait faire l'affaire... On te laisse essayer ?
__________________
Rédacteur / Modérateur SGBD Mes tutoriels et la FAQ MySQL ---------------------------------------------------- Pensez aux balises code et au tag Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
|
|
|
00
|
|
|
#3 | |||||
|
Invité régulier
![]() Inscription : septembre 2007 Messages : 13 ![]() |
Citation:
J'ai bien essayé, mais c'est la partie sélection des caractéristiques qui me pose problème. J'ai voulu faire un truc du genre : Code :
Code :
Merci. |
|||||
|
|
00
|
|
|
#4 | |||
|
Membre émérite
![]() Olivier DehorterIngenieur de recherche - Ecologue Inscription : juin 2003 Messages : 697 ![]() |
Bonjour
Citation:
Si oui, ta requête devrait plutôt ressemblée à ceci : Code sql :
Par contre, une question pourquoi utilisez le LIKE ? d'autant que l'on ne voit aucun caractères génériques. Aussi il vaut remplacer les LIKE par de simple = |
|||
|
|
00
|
|
|
#5 | ||||
|
Invité régulier
![]() Inscription : septembre 2007 Messages : 13 ![]() |
Citation:
Voici un exemple peut-être plus concret : Je cherche un "lave-vaisselle" (mon type) de la marque "Brandt" ou "AEG" (les marques) qui puisse laver "13 couverts" (caractéristique nb_couverts = 13) ET dont le niveau sonore est de "44 db" (caractéristique niveau_sonore = 44). Je ne veux pas de lave-vaisselle Brandt ou AEG 13 couverts qui émettent 49 db, ni de lave-vaisselle Brandt ou AEG 12 couverts qui émettent 44 db. S'il le faut, je peux changer de schéma de base de données. Citation:
|
||||
|
|
00
|
|
|
#6 | ||
|
Membre Expert
![]() Yannick Ingénieur Etudes & Developpements Inscription : février 2006 Messages : 1 125 ![]() |
Comme le dit dehorter olivier, votre probleme vient de votre test logique.
Vous ne faites qu'une jointure avec vos caracteristiques, or vous faites 2 test logiques dessus avec une clause AND... Un tuple ne pourra pas vous ramener de resultat pour valeur=10 ET valeur=30. Pour votre probleme, vous avez plusieurs solutions, ecrire autant de jointures que vous aurez de clauses AND dans votre test, utiliser des sous requetes, ... Exemple avec des sous requetes : Code :
Bon courage
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac) |
||
|
|
00
|
|
|
#7 | |
|
Invité régulier
![]() Inscription : septembre 2007 Messages : 13 ![]() |
Citation:
Je vais tester votre proposition et l'étudier pour la comprendre. Merci. |
|
|
|
00
|
|
|
#8 | |||
|
Membre émérite
![]() Olivier DehorterIngenieur de recherche - Ecologue Inscription : juin 2003 Messages : 697 ![]() |
la requête de Yanika_bzh doit fonctionner sans problème
![]() Il me semble avoir lu un petit papier de SQLPro indiquant que les requêtes IN étaient un peu plus optimisées que celles utilisant le EXISTS ... Par contre, je trouve que la structure de vos tables mériterait d'être optimisée Citation:
table caract Citation:
Citation:
|
|||
|
|
00
|
|
|
#9 | |
|
Invité régulier
![]() Inscription : septembre 2007 Messages : 13 ![]() |
Je viens de tester, ça marche nickel. En plus, je crois même l'avoir comprise. J'ai découvert les EXISTS et SELECT 1, mais une petite recherche et j'ai compris leurs utilisations.
Citation:
Par contre, je ne comprends comment vous scindez la table. Dans l'exemple "caract1" et "feature1" sont des noms de caractéristiques, tandis que "10" et "aaa" sont leurs valeurs. Je ne peux pas les séparer dans des tables différentes (d'autant que cet exemple est limité et qu'il y a beaucoup d'autres possibilités). Ou bien, proposez-vous de créer une table des caractéristiques avec leur nom et de créer une autre table qui les associe avec leur valeur pour chaque produit ? |
|
|
|
00
|
|
|
#10 |
|
Membre Expert
![]() Yannick Ingénieur Etudes & Developpements Inscription : février 2006 Messages : 1 125 ![]() |
Ce n'est pas vrai
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac) |
|
|
00
|
|
|
#11 | |
|
Membre émérite
![]() Olivier DehorterIngenieur de recherche - Ecologue Inscription : juin 2003 Messages : 697 ![]() |
Citation:
|
|
|
|
00
|
|
|
#12 | ||
![]() ![]() |
Citation:
MCD : marque -0,n----proposer----1,1- produit -1,1----typer----0,n- type_produit Tables : marque (mrq_id, mrq_nom...) type_produit (tpr_id, tpr_libelle) produit (prd_id, prd_id_marque, prd_id_type, prd_nom...) Est-ce que "version simplifiée" signifie qu'en réalité ton modèle est mieux normalisé ? Citation:
Et comme "les caractéristiques sont propre à chaque type de produit", il faut d'abord associer les caractéristiques aux types de produits. MCD : type_produit -1,n----avoir----0,n- caracteristique Tables : type_produit (tpr_id, tpr_libelle) caracteristique (car_id, car_nom, car_unite...) tpr_avoir_car (tac_id_type_produit, tac_id_caracteristique) Remarque : on pourrait aussi externaliser l'unité (m, db, kg, l, nombre, texte...), ajouter un type de valeur lui aussi externalisé (entier, décimal, varchar...) Ensuite il faut associer les produits aux caractéristiques : MCD : produit -1,n----avoir----caracteristique Tables : produit (prd_id, prd_id_marque, prd_id_type, prd_nom...) caracteristique (car_id, car_nom...) prd_avoir_car (pac_id_produit, pac_id_caracteristique, pac_valeur) Remarques : Vu que les valeurs peuvent être de plusieurs types, on choisira le type VARCHAR et on prévoira des fonctions de conversion dans les requêtes au endroits appropriés. Il faudra aussi prévoir dans le MCD une contrainte d'inclusion entre les deux associations "avoir" pour éviter de donner à un produit une valeur de caractéristique qui n'est pas de son type. J'arrête là pour le moment, je reviendrai plus tard sur les requêtes mais je donne une indication : pour chercher un produit qui a plusieurs caractéristiques définies, il faut faire des OR entre les conditions du WHERE, grouper par produit et vérifier que le nombre de lignes retournées est égal au nombre de caractérstiques. Ainsi, pas besoin de faire de multiples jointures avec la même table. Bon apétit !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||
|
00
|
|
|
#13 | ||
|
Invité régulier
![]() Inscription : septembre 2007 Messages : 13 ![]() |
Citation:
Citation:
J'y vais de ce pas. |
||
|
|
00
|
|
|
#14 | |
|
Membre Expert
![]() Pacman PacmanBusiness analyst Inscription : juin 2004 Messages : 1 417 ![]() |
Salut,
Citation:
Sauf spécificité d'un SGBD quelconque, aucun des deux n'est vrai. Sous Oracle, IN ou EXISTS, ça marche aussi bien l'un que l'autre, selon les cas : pas de victoire flagrante pour l'un des mots clefs. Donc ça dépend : du SGBD, du cas pratique, des volumétries, du plan d'exécution, ... pas de généralisation possible. Voilà, c'était juste pour faire mon chieur
__________________
(c'est ma photo) Paku, Paku ! Pour les jeunes incultes : non, je ne suis pas un pokémon... Le pacblog : http://pacmann.over-blog.com/ |
|
|
20
|
|
|
#15 | ||||||||||||||||||
![]() ![]() |
Citation:
Rappel d'un exemple de besoin que tu as donné : Citation:
Citation:
Citation:
Citation:
Code :
Citation:
Code :
Citation:
Code :
Citation:
1ère méthode : Code :
Autre méthode, ensembliste, à vérifier si ça fonctionne sur tous les SGBD : Code :
À vérifier quand même car avec le IN sur la marque, cela risque déjà de multiplier les lignes. En tout cas, ça décrit le principe dont je donnais l'idée dans mon précédent message.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||||||||||||||||||
|
10
|
|
|
#16 |
|
Invité régulier
![]() Inscription : septembre 2007 Messages : 13 ![]() |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com