Mysql JOINDRE plusieurs tables et sélectionnez plusieurs valeurs
Tout d'abord je tiens à m'excuser pour mon mauvais anglais. J'ai un problème avec plusieurs tables.
Je ne suis pas exactement un newby dans la base de données mySQL monde, mais je ne peux pas trouver un solution pour ce problème.
Pour ce problème, j'ai utiliser 4 tables.
- Catégories
- Produits
- Spécifications
- Specificationvalues
Chaque catégorie a des spécifications et des produits et tous les specificationvalues a les produits et les spécifications de l'id.
Désormais, l'utilisateur peut faire une sélection avec des valeurs différentes.
C'est là mon problème.
Lorsque l'utilisateur sélectionne la valeur "verte" et les jambes "4" je veux que tous les produits verts à 4 pattes.
J'ai donc utilisé une JOINTURE (de toutes sortes, je pense) pour sélectionner le bon produit (exemple ci-dessous)
SELECT DISTINCT products.id
FROM products
LEFT JOIN specificationvalues ON specificationvalues.products_id = products.id
LEFT JOIN specifications ON specificationvalues.specifications_id = specifications.id
WHERE specifications.name='materiaal'
AND specifications.name='kleur'
AND specificationvalues.id='77'
AND specificationvalues.id='78'
Le problème est que toutes les valeurs sont en lignes séparées. C'est pourquoi la OÙ ne fonctionne pas. Je n'ai pas d'erreur MySQL de. Seulement qu'elle retourne 0 lignes.
J'espère que quelqu'un pourra m'aider! J'ai eu beaucoup de bonnes choses de ce forum donc j'espère que ça va m'aider à nouveau!
Je ne sais pas pourquoi mes modifications hier où ne sont pas enregistrées. Mais voici mes données:
SPECIFICATIONS Table
ID CATEGORIES_ID NAME
38 297 Material
39 297 Measures
40 297 Color
SPECIFICATIONVALUES Table
ID SPECIFICATIONS_ID PRODUCTS_ID VALUE
1 38 988979 Masive wood
2 39 988979 24x57x98
3 40 988979 Yellow
4 40 988980 Black
5 39 388980 24x57x98
PRODUCTS Table
ID NAME
988979 Table
988980 Chair
Alors maintenant, je veux tout noir produits commercialisés et à mesure 24x57x98. J'espère que vous pourrez m'aider!
Vous devez vous connecter pour publier un commentaire.
J'ai vu beaucoup d'exemples de tables qui ont des lignes de simuler la représentation des "colonnes", où le nom est un descripteur de et du "id" ou "valeur" est associée la valeur des choses.
Ce dont vous avez besoin à considérer est ce que fait UNE LIGNE ressembler. Votre jointure à partir de spécifications nom du cahier des charges valeurs. Le '77' valeur ne correspond qu'à la "matière" spec, 'kleur', ou les deux... même avec 78. Vous pourriez avoir une variété de combinaisons, comme
Ou, si la spécification de valeurs de ID est, indépendamment de la spécification du nom, vous pouvez utiliser
PAR VOTRE NOUVELLE VERSION DU MODÈLE DE DONNÉES...
Dans ce type de critères que vous le souhaitez, je le ferais par l'application d'un double-joignez-vous à représenter chacun des critères que vous voulez, tels que:
Maintenant, peut sembler complexe, mais regardez la simplicité (explicitement par l'espacement entre les joindre des segments). Toutefois, si vous avez toujours voulu ajouter plus de "crieria" exigences, juste dupliquer par la création d'un semblable sv3, sv4, sv5 ensemble... Maintenant, cela étant dit, si vous êtes la construction de cette dynamiquement où un utilisateur peut sélectionner plus de choses, et de vous fournir une sorte de "sélection" de la description Lisible par (Couleur, de Mesure, de Matériel), puis il suffit de conserver les Identifiants de sorte que vous n'avez pas besoin de l'appoint d'adhérer, il suffit de savoir l'identification réelle, et il serait simplifiée...
Maintenant, revenons à l'origine de réponse, vous pouvez obtenir le même résultat (à condition de ne jamais avoir une couleur de "24x57x98", ou d'une mesure de "Noir" par votre exemple de données. Vous pouvez appliquer le DANS (liste de codes) ET DANS (liste de valeurs) et à l'aide d'une clause HAVING pour assurer le bon comte de correspondance éléments. Ma dernière question serait de ne pas utiliser des "Produits" que le premier, mais le second parce que vous pouvez avoir 10 000 produits, mais seulement 142 qui sont d'une taille donnée... commencer par la table/critères d'un plus petit ensemble et de se joindre à des produits afin d'obtenir le nom.
Assurer votre specificationValues table a un index sur (specifications_ID, valeur). De cette façon, l'indice peut correspondre à la FAÇON dont vous êtes à la recherche pour les données. Certains peuvent même vous suggérons de faire tous les 3 parties dans l'indice de (specifications_ID, la valeur, la products_id)
Ce n'est pas parce que
all the values are in separate rows
, c'est parce que votre clause where est toujours faux :Vous ne pouvez pas avoir et l'id est égal à 77 ET 78.
Vous devez utiliser ce genre de code :
EDIT : mon dernier
AND
sera probablement unOR
, en fonction de vos tables.