Php MySQL-每行列出同一组的成员

Php MySQL-每行列出同一组的成员,php,mysql,Php,Mysql,我有两张桌子 tbl_参与者 id group\u name firstname lastname tbl_组 id group\u name 但我很难将表格连接起来以显示下面的布局 Group Name | Member 1 | Member 2 | Member 3 名字和姓氏将显示在成员栏下 每组最多3名参与者 此查询显示列表,但不在上面的布局中: select gr.firstname, gr.lastname, gr.group_name from tbl_Participan

我有两张桌子

  • tbl_参与者

    id
    group\u name
    firstname
    lastname

  • tbl_组

    id
    group\u name

  • 但我很难将表格连接起来以显示下面的布局

    Group Name | Member 1 | Member 2 | Member 3
    
  • 名字和姓氏将显示在成员栏下
  • 每组最多3名参与者
  • 此查询显示列表,但不在上面的布局中:

    select gr.firstname, gr.lastname, gr.group_name 
    from tbl_Participants gr inner join tbl_Group gr2 
    ON gr.group_name = gr2.group_name 
    order by group_name
    

    对于MySQl 8.0+,您可以使用
    ROW_NUMBER()
    window函数按字母顺序排列组内的成员名称,并在过滤每个组的前3个名称后,使用条件聚合来获得您想要的结果:

    SELECT group_name,
           MAX(CASE WHEN rn = 1 THEN name END) Member1,
           MAX(CASE WHEN rn = 2 THEN name END) Member2,
           MAX(CASE WHEN rn = 3 THEN name END) Member3
    FROM (
      SELECT group_name, 
             CONCAT(lastname, ' ', firstname) name,
             ROW_NUMBER() OVER (PARTITION BY group_name ORDER BY lastname, firstname) rn
      FROM tbl_Participants
    ) t
    WHERE rn <= 3
    GROUP BY group_name
    
    请参阅简化版。

    如果在
    tbl_组中有组
    tbl_参与者
    中没有行,并且您希望他们出现在结果中,那么使用
    UNION ALL
    比使用联接更容易。
    添加到上述查询:

    UNION ALL
    SELECT g.group_name, null, null, null
    FROM tbl_Groups g
    WHERE NOT EXISTS (
      SELECT 1 
      FROM tbl_Participants p
      WHERE p.group_name = g.group_name
    )
    

    请提供[mre]的数据,并阅读您想要的是像第一个一样透视加入组表的意义是什么,因为组名已经在参与者表中,所以您不使用它的任何内容?@ThomasG在点击编辑按钮后加入表以列出每个组的成员。我刚刚意识到查询以请求的格式列出结果,按组名称列组,但不能使用使用ID的编辑功能。我将考虑另一种方法,以便按组添加/删除参与者。如果我想不出一种基于上述查询的方法,可能会按参与者级别进行编辑。非常感谢。
    UNION ALL
    SELECT g.group_name, null, null, null
    FROM tbl_Groups g
    WHERE NOT EXISTS (
      SELECT 1 
      FROM tbl_Participants p
      WHERE p.group_name = g.group_name
    )