【问题标题】:How do I join 2 tables to a third one which contains the primary key?如何将 2 个表连接到包含主键的第三个表?
【发布时间】:2020-02-01 20:21:13
【问题描述】:

我有 4 个表:第一个是 client 表,其中包含客户信息,client_id 作为自增主键。

第二个和第三个在结构上是相同的:它们用于跟踪参加 2 个不同的治疗计划。它们每个都有一个主键和一个用于跟踪客户端的 client_id 列。其中一个字段包含我想求和的单位。

最后一个表格包含治疗师的信息。

基本上我想从两个考勤表中提取每个客户的总单位数。

我尝试了 LEFT JOINS 无济于事。我也尝试了 UNION ALL,但无法对单位求和。

这就是表格的外观:

客户:

+---------------------------------------+
| client_id |  f_name  | l_name | th_id |
|-----------|----------|--------|-------|
|     1     | sherlock | holmes |   1   |
|     2     | john     | watson |   4   |
|     3     | hercule  | poirot |   3   |
|     4     | jane     | marple |   2   |
+---------------------------------------+

治疗师:

+--------------------------+
| th_id | f_name  | l_name |
|-------|---------|--------|
|   1   |  james  |  kirk  |
|   2   |  mr     |  spock |
|   3   |  bones  |  mccoy |
|   4   |  nyota  |  uhura |
+--------------------------+

参加:

+-------------------------------+
|   it_id   | client_id | units |
|-----------|-----------|-------|
|     1     |     1     |   4   |
|     2     |     1     |   4   |
|     3     |     1     |   0   |
|     4     |     1     |   2   |
|     5     |     4     |   0   |
|     6     |     4     |   4   |
|     7     |     4     |   0   |
|     8     |     4     |   2   |
+-------------------------------+

出席人数:

+-------------------------------+
|   it_id   | client_id | units |
|-----------|-----------|-------|
|     1     |     1     |  16   |
|     2     |     1     |  16   |
|     3     |     1     |   0   |
|     4     |     1     |  12   |
|     5     |     4     |   0   |
|     6     |     4     |  14   |
|     7     |     4     |   8   |
|     8     |     4     |  10   |
+-------------------------------+

结果应该是这样的:

+------------------------------------------------------------+
| client_id | total_units_it | total_units_psr |  therapist  |
|-----------|----------------|-----------------|-------------|
|     1     |       10       |       44        | james kirk  |
|     4     |        6       |       32        | mr spock    |
+------------------------------------------------------------+

请原谅原始表示,请不要问为什么表格设计成那样... ;-) 另外,我显然忽略了许多与问题无关的其他字段,例如日期等。

任何建议将不胜感激。

谢谢!

【问题讨论】:

    标签: mysql sql left-join


    【解决方案1】:

    您不能使用连接,否则您将创建笛卡尔积并复制行。

    相反,您执行子查询:

     SELECT c.*
          , (SELECT SUM(units) FROM attendance_it a WHERE a.client_id = c.client_id ) as total_units_it 
          , (SELECT SUM(units) FROM attendance psr a WHERE a.client_id = c.client_id ) as total_units_psr 
          , t.*
    
     FROM client c
     JOIN therapist t 
       ON c.th_id = t.th_id 
    

    【讨论】:

      【解决方案2】:

      使用按client_id分组来获得每个客户的总和。并且不需要使用 join ,因为您已经在列中拥有 id。

      【讨论】:

        猜你喜欢
        • 2023-01-29
        • 1970-01-01
        • 1970-01-01
        • 2020-04-18
        • 1970-01-01
        • 2020-09-24
        • 2019-11-11
        • 2018-06-01
        • 2021-10-07
        相关资源
        最近更新 更多