这是设置:
表A与表B有连接。表B中有多个条目(0到n),表A中可以有匹配的记录。
如果表B中存在一定数量的匹配记录,我如何形成一个只从表A给出记录的查询?
示例:
表A中有衣服。表B具有服装属性。
表B有一个表A的外键,所以它看起来像这样:
id fid_clothing1 attributeA
id fid_clothing1 attributeB
id fid_clothing1 attributeC
id fid_clothing2 attributeA
id fid_clothing2 attributeB
现在,我只想要具有属性attributeA
和attributeB
以及attributeC
的衣服。如果我进行OR查询,这不是问题,但我不能只做这样的事情:
SELECT * from tableA
LEFT JOIN tableB on tableB.fid_cloting = tableA.id
WHERE attribute='A' AND attribute='B' AND attribute='C'
这种情况永远不会评估为真。我该怎么做?
答案 0 :(得分:2)
你可以用3个内部联接做到这一点...即给我一个具有我想要的属性的行
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
答案 1 :(得分:1)
我会使用GROUP_CONCAT
来获取给定服装的所有属性的单行:
SELECT id,GROUP_CONCAT(attribute order by attribute) as Attributes
FROM tableB
GROUP BY id;
给出类似的东西:
| id | Attributes |
| 1 | A,B,C |
从此结果集中,您可以选择连接属性与您要查找的属性集匹配的ID。
从MyConcatenatedResults中选择id,其中Attributes ='A,B,C'
答案 2 :(得分:0)
可能是这个......必须尝试一下
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)
答案 3 :(得分:0)
另一种方法如下,它需要零连接,但嵌套的子查询...在虚拟数据库上尝试此操作,它似乎完成了这项工作。希望它有所帮助。
SELECT * FROM tableA A WHERE id IN ( SELECT clothing_id FROM tableB B WHERE attribute = "A" OR attribute = "B" OR attribute = "C" GROUP BY clothing_id HAVING count(*) = 3 )