mysql - 如何将 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 |
+------------------------------------------------------------+
请原谅原始表示,并且请不要问为什么表格是这样设计的... ;-) 另外,我显然忽略了许多与问题无关的其他字段,例如日期等。
任何意见,将不胜感激。
谢谢!
解决方案
您不能使用连接,否则您将创建笛卡尔积并复制行。
相反,您执行子查询:
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
推荐阅读
- python - 在运行时将包目录显式添加到 sys.path 后找不到模块
- python - 当 RMSLE 是评估指标时,lightgbm 的早期停止不起作用
- python - 撤消或重做选项创建opencv图像处理(Python)
- node.js - 均衡。GetOne 查询文本中具有 hasMany-association 的未知列
- ios - 解码后改变图像的方向
- c# - 如何在 Azure Web App 中禁用 web.config 重写规则?
- java - 为什么我的第二种方法的模拟会影响第一种方法?
- azure - 从 Azure 表存储中获取实体(限制 1)
- json - 无法使用 MasterPage 访问 webform aspx 中的隐藏字段值
- symfony - Symfony:扩展实体而不创建表