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

我有三张桌子:

  • 带字段的工人:工人id、姓名、姓氏、
  • 具有以下字段的任务:任务id、任务名称、
  • 表,其中包含工作者id和任务id
  • 我必须选择
    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 | +-----------+------+---------+-----------+