【问题标题】:How to join 3 tables into one with these tables having foreign key to a fourth table?如何将 3 个表合并为一个,这些表具有第四个表的外键?
【发布时间】:2018-08-28 21:18:18
【问题描述】:

工具包

+------------------+--------------+------+-----+---------+----------------+
| 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',

SUM(doc.doc_total) AS 'DOC', SUM(srv.srv_cheque) AS 'SRV'

key_e.k:employee.login 的外键 kit.resp_key:key_e 的外键 doc.employee_key/srv.employee_key:key_e的外键(这两个是相等的,但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'可以解决它,但我不知道如何。我使用'join'而不是这个内部选择做了一些查询,但到目前为止没有成功

【问题讨论】:

    标签: mysql sql dbeaver


    【解决方案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
    

    【讨论】:

    • 谢谢戈登。感谢您提供完美的答案并感谢您编辑我的问题,它没有被格式化
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 2014-11-16
    • 2018-04-28
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多