Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / MySQL Новый топик    Ответить
 JOIN трех таблиц  [new]
vlad5h
Member

Откуда:
Сообщений: 2
Всем привет! Помогите, пожалуйста, с запросом.
Предположим, есть три таблицы:

mysql> select * from person;
+----+------------+-----------+--------+------------+
| id | first_name | last_name | gender | birthdate |
+----+------------+-----------+--------+------------+
| 1 | Victoria | Pollard | F | 1982-12-06 |
| 2 | Emily | Howard | F | 1976-06-23 |
| 3 | David | Thomas | M | 1982-02-17 |
+----+------------+-----------+--------+------------+


mysql> select * from adress;
+-----------+--------+------------+----------+-----------+-------------+----------+
| person_id | type | street | building | apartment | city | phone_id |
+-----------+--------+------------+----------+-----------+-------------+----------+
| 1 | home | Lucas st. | 12 | | Moscow | 1 |
| 2 | home | David st. | 72 | 712 | Moscow | 3 |
| 2 | office | Thames st. | 76 | office 48 | Moscow | 3 |
| 3 | home | Lucas st. | 22 | 12 | Moscow | 6 |
| 3 | office | Lucas st. | 14 | | Moscow | 6 |
+-----------+--------+------------+----------+-----------+-------------+----------+


mysql> select * from phone;

+----+-----------+--------+--------------------------+
| id | person_id | type | phone_number |
+----+-----------+--------+--------------------------+
| 1 | 1 | home | +1 800 555 1234 |
| 2 | 1 | mobile | +1 202 123 4567 |
| 3 | 2 | home | +1 800 555 2345 |
| 4 | 2 | office | +1 221 754 9384 ext 2145 |
| 5 | 2 | mobile | +1 214 991 2385 |
| 6 | 3 | mobile | +1 201 465 4878 |
+----+-----------+--------+--------------------------+


Нужно одним запросом получить такой результат - Список людей, живущих на Lucas st., их домашний адрес и домашний номер телефона (И чтобы отображался результат с NULL, то есть человек без home phone number)
+------------------+-----------+----------+-----------+-----------------+
| person | street | building | apartment | phone_number |
+------------------+-----------+----------+-----------+-----------------+
| Victoria Pollard | Lucas st. | 12 | | +1 800 555 1234 |
| David Thomas | Lucas st. | 22 | 12 | NULL |
+------------------+-----------+----------+-----------+-----------------+


Запрос вида
select concat(p.first_name,' ', p.last_name) as person, a.street, a.building, a. apartment, ph.phone_number
from person p 
JOIN adress a ON p.id = a.person_id 
JOIN phone ph ON p.id = ph.person_id
WHERE a.type = 'home' AND a.street = 'Lucas st.' AND ph.type = 'home';

Показывает только первую строку из нужного результата

+------------------+-----------+----------+-----------+-----------------+
| person | street | building | apartment | phone_number |
+------------------+-----------+----------+-----------+-----------------+
| Victoria Pollard | Lucas st. | 12 | | +1 800 555 1234 |
+------------------+-----------+----------+-----------+-----------------+

Различные комбинации из LEFT и RIGHT JOINS показываю тоже самое. Никак не могу понять, как добиться нужного результата. Джоинить таблицы в другом порядке? Или использовать Union ALL? Подскажите, пожалуйста.
7 фев 20, 11:43    [22075455]     Ответить | Цитировать Сообщить модератору
 Re: JOIN трех таблиц  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1455
vlad5h,

Показывайте ваши запросы с "Различными комбинациями из LEFT и RIGHT JOINS"
Но даже не видя запросы можно сказать, что вы своим WHERE "срезаете" все данные внешнего соединения до обычного INNER JOIN-а...
7 фев 20, 12:00    [22075473]     Ответить | Цитировать Сообщить модератору
 Re: JOIN трех таблиц  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1455
попробуйте перенести условие AND ph.type = 'home' из секции where в секцию on и сделать соединение левым:
vlad5h
select concat(p.first_name,' ', p.last_name) as person, a.street, a.building, a. apartment, ph.phone_number
from person p 
JOIN adress a ON p.id = a.person_id 
LEFT JOIN phone ph ON p.id = ph.person_id AND ph.type = 'home'
WHERE a.type = 'home' AND a.street = 'Lucas st.';
7 фев 20, 12:12    [22075483]     Ответить | Цитировать Сообщить модератору
 Re: JOIN трех таблиц  [new]
vlad5h
Member

Откуда:
Сообщений: 2
Спасибо! То, что нужно.
7 фев 20, 13:51    [22075582]     Ответить | Цитировать Сообщить модератору
Все форумы / MySQL Ответить