根据其他表中的条目从表中选择

时间:2009-08-26 22:34:44

标签: mysql

这是设置:

表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

现在,我只想要具有属性attributeAattributeB以及attributeC的衣服。如果我进行OR查询,这不是问题,但我不能只做这样的事情:

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

这种情况永远不会评估为真。我该怎么做?

4 个答案:

答案 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
            )