MySQL链接表交集查询

时间:2014-04-19 19:53:26

标签: mysql sql

对不起,如果我的问题听起来有误导性,我不完全确定如何制定它。

请考虑以下表:具有ID和名称的Fruit,具有ID和名称的Person,以及具有Person_ID和Fruit_ID的Person_has_Fruit(多对多链接表)。

什么交易可以检索具有两个或更多特定水果的人?基本上我该如何与结果相交?

示例:

水果表

ID | Name
-----------------
1  | Apple
2  | Pineapple
3  | Banana
4  | Lemon

人员表

ID | Name
-----------------
1  | Tom
2  | Bill
3  | John

多对多的表

PersonID | FruitID
-----------------
    3   |    1
    1   |    2
    3   |    2
    2   |    3
    3   |    3

当我要求有苹果,菠萝和香蕉的人时,我想要一个查询来找回约翰。有什么建议吗?

我已经尝试过选择*来自Person_has_Fruit,哪里有FruitID(' 1',' 2',' 3')&# 39;但这是不正确的,因为它检索所有具有其中一个的人ID,所以基本上它意味着值之间的关系。

2 个答案:

答案 0 :(得分:1)

您希望在Fruit表和Person表的某些元组之间执行关系划分。

所以:

Select * From Person p
Where Not Exists ( Select * from Fruit f 
                   Where (Name = 'Apple' Or Name = 'Pinneapple' or Name = 'Banana')
                   And Not Exists ( Select * from Person_has_Fruit pf
                                    Where pf.PersonId = p.ID and pf.FruitId=f.ID))

答案 1 :(得分:0)

首先尝试创建视图。

CREATE VIEW fruitowners AS 
( SELECT personfruit.personID, fruittable.id, persontable.person, fruittable.fruit
FROM persontable, fruittable, personfruit
WHERE personfruit.personID=persontable.id AND personfruit.fruitID=fruittable.id )

然后:

SELECT fruit FROM fruitowners
WHERE person='John'

返回John拥有的所有水果类型

SELECT person FROM fruitowners
WHERE fruit='Banana'

返回所有香蕉业主。

SELECT COUNT(*) FROM fruitowners WHERE person='John'

返回John拥有的水果数量

SELECT COUNT('fruit') FROM fruitowners WHERE person='John' and fruit='Banana'

返回John拥有多少香蕉