首页 > 解决方案 > 如何将 2 个表连接到包含主键的第三个表?

问题描述

我有 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   |
+-------------------------------+

出席psr:

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

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

任何意见,将不胜感激。

谢谢!

标签: mysqlsqlleft-join

解决方案


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

相反,您执行子查询:

 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 

推荐阅读