Sélectionnez dans le tableau en fonction des entrées dans autre table

voix
5

Ceci est la configuration:

Le tableau A présente une connexion au tableau B. Il y a plusieurs entrées (0 à n) dans le tableau B qui peuvent avoir un enregistrement correspondant dans le tableau A.

Comment puis-je forme une requête qui me donne un enregistrement de la table A que si un certain nombre d'enregistrements correspondants existent dans le tableau B?

Exemple:

Le tableau A a des vêtements en elle. Le tableau B a des attributs pour les vêtements.

Le tableau B a une clé étrangère à la table A il ressemblerait à quelque chose comme ceci:

id  fid_clothing1  attributeA
id  fid_clothing1  attributeB
id  fid_clothing1  attributeC
id  fid_clothing2  attributeA
id  fid_clothing2  attributeB

Maintenant, je veux que les vêtements qui ont l' attribut attributeAET attributeBET attributeC. Ce n'est pas un problème si je fais un OU-requête , mais je ne peux pas faire quelque chose comme:

SELECT * from tableA
LEFT JOIN tableB on tableB.fid_cloting = tableA.id
WHERE attribute='A' AND attribute='B' AND attribute='C'

Cette condition ne sera jamais évaluée à true. Comment je fais ça?

Créé 26/08/2009 à 23:34
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
2

Vous pouvez le faire avec trois jointures internes ... ie me donner le tableau A lignes qui ont les attributs que je veux

SELECT A.id FROM tableA A
INNER JOIN tableB BA ON A.id = BA.fid_clothing AND BA.Attribute='A'
INNER JOIN tableB BB ON A.id = BB.fid_clothing AND BB.Attribute='B'
INNER JOIN tableB BC ON A.id = BC.fid_clothing AND BC.Attribute='C'
GROUP BY A.id
Créé 26/08/2009 à 23:52
source utilisateur

voix
1

J'utiliser GROUP_CONCATpour aller chercher une seule rangée de tous les attributs d'un morceau donné de vêtements:

SELECT id,GROUP_CONCAT(attribute order by attribute) as Attributes 
FROM tableB 
GROUP BY id;

Donner quelque chose comme:

| id | Attributes |
|  1 | A,B,C      |

A partir de ce ResultSet, vous pouvez sélectionner les ids pour lesquels l'attribut concaténés correspondait à l'ensemble d'attributs que vous recherchez.

select id de MyConcatenatedResults où les attributs = 'A, B, C'

Créé 27/08/2009 à 10:58
source utilisateur

voix
0

Une autre façon de faire est la suivante, qui ne nécessite aucun joint, mais une sous-requête imbriquée ... ont tente ce sur une base de données factice, et il semble faire le travail. J'espère que cela aide.

SELECT * 
DE tableA A 
WHERE id IN ( 
              SELECT clothing_id
              DE tableB B
                attribuer = "A"
                OU attribut = « B »
                OU attribut = « C »
              GROUP BY clothing_id
              comptage ayant (*) = 3
            )
Créé 27/08/2009 à 09:06
source utilisateur

voix
0

Peut-être celui-ci .. doivent essayer

SELECT * FROM TABLEA a, TABLE b 
WHERE a.id = b.clothing_id 
AND a.id in (SELECT clothing_id from TABLEB where attribute = 'A' AND clothing_id = a.id
UNION select clothing_id from TABLEB where attribute = 'B' AND clothing_id = a.id
UNION select clothing_id from TABLEB where attribute = 'C' AND clothing_id = a.id)
Créé 27/08/2009 à 04:31
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more