2012-02-16 2 views
1

Это делается в MySQL 5.SQL Query construction - требуется несколько запросов? Вложенный выбор?

У меня есть список членов, у которых есть один или несколько адресов, адресов электронной почты и телефонов. Каждый член может также иметь нескольких друзей, каждый из которых может также иметь адрес, адрес электронной почты и номера телефонов.

Так что мои таблицы (упрощенный количество полей для краткости):

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

Try:

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

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

Смежные вопросы