2010-04-05 23 views
2

Je sais que mySQL 5.x ne supporte pas INTERSECT, mais cela semble être ce dont j'ai besoin.Experts mySQL - besoin d'aide avec 'intersect'

Tableau A: Produits (p_id)

Tableau B: Prod_cats (cat_id) - info catégorie (nom, description, etc.)

Tableau C: prod_2cats (p_id, cat_id) - beaucoup à beaucoup

prod_2cats contient les nombreuses catégories (1 ou plus) qui ont été attribuées aux produits (A). Faire une requête/recherche de filtre, (interactif) et doivent être en mesure de sélectionner parmi plusieurs catégories les produits qui répondent à TOUS les critères.

Ex: - 80 produits affectés à la catégorie X - 50 produits affectés à la catégorie Y - mais seulement 10 produits (Intersection) sont assignés aux deux chats X et le chat Y

Ce sql fonctionne pour une catégorie :

SELECT * FROM produits WHERE p_show = 'Y' et p_id IN (SELECT p_id dE prods_2cats AS PC où PC.cat_id = "$ cat_id.".

< - cat_id $ est désinfecté var transmis de requête formulaire

Je ne peux pas sembler trouver les moyens de dire « me donner l'Intersect de chat Un chat et B » et récupérer le sous-ensemble (10 enregistrements, de mon exemple)

Aide!

Répondre

1

Appliquer la définition d'intersection de la théorie des ensembles . Donc, si X Y intersecte donne ensemble Z, puis pour chaque x dans Z, il soutient que x est dans X et X est Y.

Quelque chose comme

SELECT * FROM products WHERE p_show='Y' AND p_id IN 
(SELECT p_id FROM prods_2cats AS PC WHERE PC.cat_id =X) AND p_id IN 
(SELECT p_id FROM prods_2cats AS PC WHERE PC.cat_id =Y) 
+0

Merci - c'est ce que je suis allé avec, et cela a fonctionné. (le chaînage de ANDS) – MTCreations

2

Hmm, je ne suis pas sûr que c'est la meilleure façon de le faire, mais il peut être ajouté à votre requête déjà existante assez facilement:

SELECT * 
FROM products 
WHERE p_show='Y' 
    AND p_id IN (SELECT p_id 
       FROM prods_2cats AS PC 
       WHERE PC.cat_id = $cat1_id) 
    AND p_id IN (SELECT p_id 
       FROM prods_2cats AS PC2 
       WHERE PC2.cat_id = $cat2_id) 
+0

Merci - c'est ce que je suis allé avec, et cela a fonctionné. (le chaînage de ANDS) – MTCreations

1
SELECT * 
FROM products 
WHERE p_show='Y' 
    AND p_id IN (SELECT p_id 
       FROM prods_2cats AS PC 
       WHERE PC.cat_id in ($cat1_id, $cat2_id)) 

OU encore mieux

Espérons que cela aide

+0

Merci pour la réponse - Je préférais l'autre (ANDS en chaîne) car il y avait d'autres parties de la requête que je laissais pour plus de simplicité - et un ensemble imbriqué de sous-requêtes serait beaucoup plus difficile à travailler dynamiquement (comme opposition à une collection de chaînes ET). – MTCreations

+0

@MITCreations: de nada =) Avoir imbriqué est plus court, et je ne vois aucune raison pour laquelle construire dynamiquement expression en est plus difficile que d'ajouter une autre condition avec AND, IMHO – vittore