powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / JOIN трех таблиц
4 сообщений из 4, страница 1 из 1
JOIN трех таблиц
    #39923844
vlad5h
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет! Помогите, пожалуйста, с запросом.
Предположим, есть три таблицы:

mysql> select * from person;
Код: plaintext
1.
2.
3.
4.
5.
6.
+----+------------+-----------+--------+------------+
| 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;
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 [code=plaintext]+-----------+--------+------------+----------+-----------+-------------+----------+
| 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;

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
+----+-----------+--------+--------------------------+
| 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)
Код: plaintext
1.
2.
3.
4.
5.
+------------------+-----------+----------+-----------+-----------------+
| person           | street    | building | apartment | phone_number    |
+------------------+-----------+----------+-----------+-----------------+
| Victoria Pollard | Lucas st. | 12       |           | +1 800 555 1234 |
| David Thomas     | Lucas st. | 22       | 12        | NULL            |
+------------------+-----------+----------+-----------+-----------------+


Запрос вида
Код: sql
1.
2.
3.
4.
5.
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';


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

Код: plaintext
1.
2.
3.
4.
+------------------+-----------+----------+-----------+-----------------+
| person           | street    | building | apartment | phone_number    |
+------------------+-----------+----------+-----------+-----------------+
| Victoria Pollard | Lucas st. | 12       |           | +1 800 555 1234 |
+------------------+-----------+----------+-----------+-----------------+

Различные комбинации из LEFT и RIGHT JOINS показываю тоже самое. Никак не могу понять, как добиться нужного результата. Джоинить таблицы в другом порядке? Или использовать Union ALL? Подскажите, пожалуйста.
...
Рейтинг: 0 / 0
JOIN трех таблиц
    #39923853
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlad5h,

Показывайте ваши запросы с "Различными комбинациями из LEFT и RIGHT JOINS"
Но даже не видя запросы можно сказать, что вы своим WHERE "срезаете" все данные внешнего соединения до обычного INNER JOIN-а...
...
Рейтинг: 0 / 0
JOIN трех таблиц
    #39923860
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуйте перенести условие AND ph.type = 'home' из секции where в секцию on и сделать соединение левым:
vlad5h
Код: sql
1.
2.
3.
4.
5.
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.';

...
Рейтинг: 0 / 0
JOIN трех таблиц
    #39923929
vlad5h
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо! То, что нужно.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / JOIN трех таблиц
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]