MySQL Views: Подсоединения - PullRequest
1 голос
/ 16 июля 2009

Я хочу иметь таблицу представлений, которая объединяет строки из четырех таблиц.

Первая первичная таблица - client - это просто уникальный идентификатор первичного ключа и идентификатор_профиля. Вторая таблица, profile , содержит всю информацию о имени, адресе, почтовом индексе. Третья таблица - электронная почта ; к одному клиентскому объекту может быть много объектов электронной почты, но есть только один объект электронной почты с столбцом primary помеченным как true; четвертая таблица - phone - это также отношение многие к одному (могут быть мобильные телефоны, домашние телефоны, номера факсов и т. д.), и только один объект может иметь primary колонка помечена.

Присоединиться к таблице client с таблицей profile просто, как один к одному; Я хочу получить совет о том, как выбрать объект электронной почты и телефона на основе столбца primary (а не первого результата JOINed).

Будем весьма благодарны за любые ресурсы, на которые я могу указать; как я искал материал в течение нескольких дней.

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 16 июля 2009

Не должно быть никаких проблем с присоединением к email и phone. Просто присоединитесь к ним в другом прямом соединении и добавьте WHERE phone.primary = TRUE как обычный WHERE -клаус.

Следующее, я думаю, должно это сделать:

SELECT * 
  FROM client
  JOIN profile
  ON profile.client_id = client.id
  JOIN email
  ON email.client_id = client.id
  JOIN phone
  ON phone.client_id = client.id
WHERE phone.primary = TRUE AND
      email.primary = TRUE
0 голосов
/ 16 июля 2009
select whatevercolumnsyouwant
  from client
  join profile using (profile_id)
  join email on client.profile_id = email.profile_id
            and email.primary = 1
  join phone on client.profile_id = phone.profile_id
            and phone.primary = 1
where client.id = :whateverclientid

Ключевым моментом является то, что в подпунктах ON предложений JOIN можно указывать несколько условий (в AND, OR и т. Д.) Так же, как в предложениях WHERE, но с более «конкретной» целью!

...