Конструкция SQL-запроса - нужно несколько запросов? Вложенный выбор? - PullRequest
1 голос
/ 16 февраля 2012

Это делается в MySQL 5.

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

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

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

Ответы [ 2 ]

1 голос
/ 16 февраля 2012

Попробуйте:

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 голосов
/ 16 февраля 2012

вы на правильном пути, вам просто нужно снова добавить те же таблицы на этот раз, присоединяясь к идентификатору друга:

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

это грязно, да, я бы создал представление с вашим основным запросоми затем снова присоединитесь к представлению с помощью телефонного стола, чтобы получить телефон друга.Просто для простоты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...