2012-02-16 129 views
1

这是在MySQL 5中完成的。SQL查询构建 - 需要多个查询?嵌套选择?

我有一个或多个地址,电子邮件和电话号码的成员列表。 每个成员也可以有多个朋友,每个朋友也可以有地址,电子邮件和电话号码。

所以我的表是(简体号为简洁的字段):

member: id, firstName, lastName 
address: id, city, personId 
phone: id, number, personId 
email: id, address, personId 
friend_x_member: id, memberId, friendId 

我无法弄清楚如何使一个查询在那里我得到的会员信息与所有他的地址,电话号码和电子邮件地址以及他的朋友和他们的所有地址,电话号码,电子邮件地址。我想也许我不应该在一个查询中做这件事?

这至少得到我的成员信息,我只需要弄清楚如何遍历行以获得我的对象填充正确。但我不知道从哪里何去何从.....

select * 
from member, address, email, phone, friend_x_member 
where member.id = '1' and 
     address.personId = member.id and 
     email.personId = friend.id and 
     phone.personId = friend.id and 
     friend_x_member.memberId = member.id 

回答

1

尝试:您现有的查询(和上面的查询)使用内部连接

select * 
from member, address, email, phone 
where member.id in (select '1' union all 
        select friendId from friend_x_member 
        where friend_x_member.memberId = '1') and 
     address.personId = member.id and 
     email.personId = friend.id and 
     phone.personId = friend.id and 

注 - 因此,如果任何一个查找表不具备会员“1”的记录,什么都不会被退回。为了解决这个问题,请尝试使用外部连接:

select * 
from member 
left join address on address.personId = member.id 
left join email on email.personId = friend.id 
left join phone on phone.personId = friend.id 
where member.id in (select '1' union all 
        select friendId from friend_x_member 
        where friend_x_member.memberId = '1') 
+0

辉煌,谢谢!外连接正是我所需要的,因为在使用外连接后,我没有收回所有数据,但我不知道为什么。这很棒! – Michaela 2012-02-16 15:23:26

0

你是在正确的轨道上,你只需要再次添加相同的表这次与朋友ID加盟:

select *, P_friend.number as FirendsPhoneNumber 
from member, address, email, phone, friend_x_member, phone P_friend 
where member.id = '1' and address.personId = member.id and email.personId = friend.id and phone.personId = friend.id and friend_x_member.memberId = member.id and member.memberID=P_friend.friendId 

这很麻烦是的,我会创建一个与您的主要查询视图,然后再次加入视图与电话表来获取朋友的电话。只是为了简单。

+0

感谢制作视图是一个好主意,我认为我会尝试。 – Michaela 2012-02-16 15:22:51