Неразрешимый SQL-запрос

Мне нужна помощь с MySQL-запросом.

Table Company:
(PK) ID_Company
CompanyName
...

Table Address:
(PK) ID_Address
(FK) ID_Company
Street
...

Table ContactPerson:
(PK) ID_ContactPerson
(PK) ID_Company
PersonName
...

Теперь я хочу создать оператор SELECT, чтобы получить список со всеми клиентами. Это должно выглядеть так:

ID_Company    CompanyName    Street    PersonName
    1           Google        Test        Joe

Но у компании не может быть ни одного, одного или нескольких адресов и контактных лиц. Я хочу выбрать только один адрес и одно контактное лицо в этом запросе. И это тот момент, когда я не знаю, как это сделать.

Я пробовал выбрать MIN для ID_Address, но это не работает, если у компании нет адреса и контактного лица.

Надеюсь, вы понимаете, что я пытаюсь сделать.

Спасибо за вашу помощь! :)

Как выбрать адрес или контактное лицо, если у компании их несколько?

jarlh 08.11.2018 16:21

Добро пожаловать на сайт! На самом деле это не проблема SQL; это проблема архитектуры данных. Мы можем легко рассказать вам, как получить адрес ан и контактное лицо а для каждой компании, но только вы можете выбрать адрес который или контактное лицо, которое вам нужно. Если вам все равно, какой адрес или контактное лицо вы получите, обновите свой вопрос, указав это.

elixenide 08.11.2018 16:21

Начните с LEFT JOINs.

jarlh 08.11.2018 16:21

В этом суть: на самом деле не имеет значения, какой адрес выбран. Идеальным будет тот, который был создан первым (PK имеют auto_increment, поэтому в этом случае адрес / лицо с наименьшим PK)

Leon Reucher 08.11.2018 16:24
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
4
129
1

Ответы 1

Можно использовать left join и агрегацию:

select c.ID_Company, c.company_name, min(street), min(person_name)
from company c left join
     address a
     on c.ID_Company = a.ID_Company left join
     ContactPerson cp
     on cp.ID_Company = a.ID_Company
group by c.ID_Company, c.company_name;

Сначала спасибо за ответ. Но если я ВЫБИРАЮ a.ID_Company, что, если для этой компании нет адреса? PK для этой строки в ID_Company будет нулевым.

Leon Reucher 08.11.2018 16:32

Я изменил этот запрос и заставил его работать. Намного проще, чем я думал! Большое спасибо за Вашу помощь! :)

Leon Reucher 08.11.2018 16:41

@arahman. . . Я форматирую свой код точно так, как хочу. LEFT JOIN - оператор, соединяющий две таблицы. Я не начинаю строки с бинарных операторов. Все ключевые слова, выровненные по левому краю, начинают предложения SQL.

Gordon Linoff 08.11.2018 17:16

Другие вопросы по теме