Как объединить 3 таблицы в одну с этими таблицами, имеющими внешний ключ к четвертой таблице?

Комплект

+------------------+--------------+------+-----+---------+----------------+
| Field            | Type         | Null | Key | Default | Extra          +------------------+--------------+------+-----+---------+----------------+
| id               | int(11)      | NO   | PRI | NULL    | auto_increment | protocol         | varchar(100) | YES  | UNI | NULL    |                | detail_service   | varchar(120) | YES  |     | NULL    |                | date_conclusion  | date         | YES  |     | NULL    |                | resp_key         | varchar(10)  | YES  | MUL | NULL    |                |------------------+--------------+------+-----+---------+----------------+

док

+---------------------+-------------+------+-----+---------+----------------+
| Field               | Type        | Null | Key | Default | Extra          |
+---------------------+-------------+------+-----+---------+----------------+
| id                  | int(11)     | NO   | PRI | NULL    |auto_increment | employee_key        | varchar(10) | YES  | MUL | NULL    |                | doc_total           | int(11)     | YES  |     | NULL    |                | date_doc            | date        | YES  |     | NULL    |                +---------------------+-------------+------+-----+---------+----------------+

SRV

+-------------------+--------------+------+-----+---------+----------------+
| Field             | Type         | Null | Key | Default | Extra          +-------------------+--------------+------+-----+---------+----------------+
| id                | int(11)      | NO   | PRI | NULL    | auto_increment | employee_key      | varchar(10)  | YES  | MUL | NULL    |                | srv_total         | int(11)      | YES  |     | NULL    |                | date_srv          | date         | YES  |     | NULL    |                +-------------------+--------------+------+-----+---------+----------------+

key_e

+-------------------+--------------+------+-----+---------+-------+
| Field             | Type         | Null | Key | Default | Extra |
+-------------------+--------------+------+-----+---------+-------+
| key               | varchar(10)  | NO   | PRI | NULL    |       |
| login_employee    | varchar(100) | YES  | MUL | NULL    |       |
+-------------------+--------------+------+-----+---------+-------+

наемный рабочий

+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| login      | varchar(100) | NO   | PRI | NULL    |       |
| name       | varchar(100) | YES  |     | NULL    |       |
+------------+--------------+------+-----+---------+-------+

У меня есть эти 5 таблиц. Я хочу получить результат, подобный этим полям:

 employee.login, employee.name, SUM(kit.detail_service LIKE '%Deal%') AS 'Deal', SUM(kit.detail_service LIKE '%Not Deal%') AS 'Not Deal', SUM(kit.detail_service LIKE '%Postponed%') AS 'Postponed',

СУММ (doc.doc_total) КАК 'DOC', СУММ (srv.srv_cheque) КАК 'SRV'

key_e.k: Внешний ключ к employee.login kit.resp_key: Внешний ключ для key_e doc.employee_key / srv.employee_key: Внешний ключ для key_e (оба эти 2 равны, но отличаются от kit.resp_key)

Я сделал запрос:

SELECT
    e.login,
    e.name,
    (SELECT SUM(k.detail_service LIKE '%Deal%') FROM kit k WHERE k.resp_key=key_e.key) AS 'Deal',
    (SELECT SUM(k.detail_service LIKE '%Not Deal%') FROM kit k WHERE k.resp_key=key_e.key) AS 'Not Deal',
    (SELECT SUM(k.detail_service LIKE '%Postponed%') FROM kit k WHERE k.resp_key=key_e.key) AS 'Postponed',
    (SELECT SUM(doc_total) FROM doc WHERE doc.employee_key=key_e.key) AS 'DOC',
    (SELECT SUM(srv_total) FROM srv WHERE srv.employee_key=key_e.key) AS 'SRV'
FROM
    employee e
INNER JOIN key_e ON
    e.login = key_e.login_employee
GROUP BY e.login, key_e.key

========================================

Запрос, который я сделал, возвращает мне почти все, что я хочу, кроме дублированных строк. Поскольку ключ KIT и ключ SRV и DOC различны, результат повторяется. Я не знаю, как присоединиться к строке с ключом SRV и ключом DOC с ключом KIT. Структура довольно запутанная, и, возможно, использование «соединения» решит эту проблему, но я не знаю, как это сделать. Я сделал несколько запросов, используя 'join', а не этот внутренний выбор, но пока безуспешно

Освоение архитектуры микросервисов с 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
0
167
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, вам нужно два уровня агрегирования. В частности, вы хотите агрегировать на ключевом уровне перед, выполняя соединения. Затем вы хотите агрегировать на уровне входа в систему:

SELECT e.login, e.name,
       SUM(kit.num_Deal) as num_Deal,
       SUM(kit.num_not_deal) as num_not_deal,
       SUM(kit.num_Postponed) as num_Postponed,
       SUM(doc_total) as doc_total,
       SUM(srv_total) as srv_total
FROM employee e INNER JOIN
     key_e ON
     ON e.login = key_e.login_employee LEFT JOIN
     (SELECT doc.employee_key, SUM(doc.doc_total) as doc_total
      FROM doc
      GROUP BY doc.employee_key
     ) doc
     ON doc.employee_key = key_e.key LEFT JOIN
     (SELECT srv.employee_key, SUM(srv.srv_total) as srv_total
      FROM srv
      GROUP BY srv.employee_key
     ) srv
     ON srv.employee_key = key_e.key LEFT JOIN
     (SELECT kit.employee_key, 
             SUM(k.detail_service LIKE '%Deal%') as num_Deal,
             SUM(k.detail_service LIKE '%Not Deal%') as num_not_deal,
             SUM(k.detail_service LIKE '%Postponed%') as Postponed
      FROM kit k
      GROUP BY kit.employee_key
     ) kit
     ON kit.resp_key = key_e.key
GROUP BY e.login, e.name

спасибо Гордон. Спасибо за ответ, который отлично работает, и спасибо, что отредактировали мой вопрос, что он не был отформатирован

Fernando Souza Lopes 29.08.2018 13:24

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