MySQL正在选择数据,而不是重复ID
我有三张桌子:MySQL正在选择数据,而不是重复ID,mysql,sql,join,select,group-by,Mysql,Sql,Join,Select,Group By,我有三张桌子: 带字段的工人:工人id、姓名、姓氏、 具有以下字段的任务:任务id、任务名称、 表,其中包含工作者id和任务id 我必须选择worker\u id,姓名,姓氏,以及任务名。问题是我不知道如何在选择数据时不复制worker_id(我必须显示worker的所有任务) 我提出了一个查询,但正如我前面提到的,它对我来说不太合适(它重复了工作人员的id) 问题是我不知道如何在选择数据时不复制worker_id(我必须显示worker的所有任务) 看起来您需要字符串聚合。您可以使用group
worker\u id
,姓名
,姓氏
,以及任务名
。问题是我不知道如何在选择数据时不复制worker_id(我必须显示worker的所有任务)
我提出了一个查询,但正如我前面提到的,它对我来说不太合适(它重复了工作人员的id)
问题是我不知道如何在选择数据时不复制worker_id(我必须显示worker的所有任务)
看起来您需要字符串聚合。您可以使用group\u concat()
将每个工作人员的所有任务作为逗号分隔的列表放在一列中
您可以使用联接或相关子查询执行此操作,如下所示:
select
w.worker_id,
w.name,
w.surname,
(
select group_concat(t.task_name)
from implementing i
inner join tasks t on t.task_id = i.task_id
where i.worker_id = w.worker_id
) task_names
from worker w
请注意,这使用了标准的显式连接(在关键字上使用
),而不是老式的隐式连接(在
从句的中使用逗号):几十年前的这种语法使查询更难遵循和维护,不应该在新代码中使用
+-----------+------+---------+-----------+
| worker_id | name | surname | task_name |
+-----------+------+---------+-----------+
| 1 | John | Smith | TASK A |
| 1 | John | Smith | TASK B |
| 2 | Jane | Miller | TASK C |
+-----------+------+---------+-----------+
+-----------+------+---------+-----------+
|工人|身份|姓名|姓氏|任务|姓名|
+-----------+------+---------+-----------+
|1 |约翰|史密斯|任务A|
|| | |任务B|
|2 |简|米勒|任务C|
+-----------+------+---------+-----------+
请提供样本数据和预期结果。如果一个工作者有多个任务,您希望如何在一行上表示这些任务?这是20世纪80年代使用的联接语法。你多大了?使用显式联接(内部联接
,左侧外部联接
,等等),这使得它在1992年成为了SQL标准。为什么要投否决票?我觉得这个很好。(不管怎么说,否决一个答案而不解释原因是不礼貌的,也是毫无帮助的。)非常感谢你的帮助。这就是我想要的:)
+-----------+------+---------+-----------+
| worker_id | name | surname | task_name |
+-----------+------+---------+-----------+
| 1 | John | Smith | TASK A |
| 1 | John | Smith | TASK B |
| 2 | Jane | Miller | TASK C |
+-----------+------+---------+-----------+
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 | name | surname | task_name |
+-----------+------+---------+-----------+
| 1 | John | Smith | TASK A |
| | | | TASK B |
| 2 | Jane | Miller | TASK C |
+-----------+------+---------+-----------+