你会得到类似的东西
+-----------+------+---------+------------+
| worker_id | 姓名 | 姓氏 | 任务名称 |
+-----------+------+---------+------------+
| 1 | 约翰 | 史密斯 | 任务 A |
| 1 | 约翰 | 史密斯 | 任务 B |
| 2 | 简 | 米勒 | 任务 C |
+-----------+------+---------+------------+
这正是它应该的样子。SQL 查询返回包含列和行的表。如果没有工人信息,一行的数据将是不完整的。CASE您可以使用表达式和分析函数(自 MySQL 8 起可用)来抑制这一点LAG,但您应该在显示数据的应用程序或网站中执行此操作。(这也是您决定是否为小数点分隔符显示逗号或点的地方。) SQL 是数据提供者,您的应用程序关心表示。
无论如何,这是在 MySQL 8 中执行此操作的查询:
select
case when w.worker_id = lag(w.worker_id) over (order by w.worker_id, t.task_id) then null else w.worker_id end as worker_id,
case when w.worker_id = lag(w.worker_id) over (order by w.worker_id, t.task_id) then null else w.name end as name,
case when w.worker_id = lag(w.worker_id) over (order by w.worker_id, t.task_id) then null else w.surname end as surname,
t.tasks_name
from workers w
join implementing i on i.worker_id = w.worker_id
join tasks t on t.task_id = i.task_id
order by w.worker_id, t.task_id;
+-----------+------+---------+------------+
| worker_id | 姓名 | 姓氏 | 任务名称 |
+-----------+------+---------+------------+
| 1 | 约翰 | 史密斯 | 任务 A |
| | | | 任务 B |
| 2 | 简 | 米勒 | 任务 C |
+-----------+------+---------+------------+