尽管使用GROUP BY子句,但仍在获取单个列值

时间:2017-05-12 19:35:45

标签: mysql sql select

背景

我有一些体育数据表。我有一个team表和一个manager表。

manager表格中的一行有team_id

我想介绍拥有多个经理的团队,目前输出如下:

| Team  | Managers |
| TEAM1 | 2        |
| TEAM2 | 4        |

(这是一个非常简化的版本,但我认为你得到了要点。)

我使用如下查询获取此数据:

SELECT 
    COUNT(*) AS Managers,
    team.name as Team
FROM team
    LEFT JOIN manager ON manager.team_id = team.id
GROUP BY team.id HAVING Managers > 1;

升级

我被要求为此添加另一个输出,即这些团队的所有经理的名称,有多个。

所需的示例输出:

| Team  | Managers | Names                              |
| TEAM1 | 2        | Al Bal, Cal Dal                    |
| TEAM2 | 4        | Fal Gal, Hal Jal, Kal Lal, Mal Nal |

问题

如何从所有单独的行中获取信息,同时将它们分组?

或者,是否有办法获得所需的经理名称串联,同时仍然将它们分组,如图所示?

到目前为止,如果我只是将manager.name添加到SELECT的事物列表中,它只输出其中一个。并不是说我期待它能够发挥作用。把它扔进那里。

3 个答案:

答案 0 :(得分:1)

使用GROUP_CONCAT连接一行上的不同管理器名称。

SELECT 
    COUNT(*) AS Managers,
    team.name as Team,
    GROUP_CONCAT(manager.name ORDER BY manager.name)    
FROM team
    LEFT JOIN manager ON manager.team_id = team.id
GROUP BY team.id HAVING Managers > 1

答案 1 :(得分:1)

您想使用group_concat()来获取名称。但是,您还应该修复连接:

SELECT t.name as Team, COUNT(*) as num_managers,
       GROUP_CONCAT(m.name SEPARATOR ' ') as managers
FROM team t JOIN
     manager m
     ON m.team_id = t.id
GROUP BY t.id
HAVING num_managers > 1;

因为您需要匹配来获取经理,所以不需要外部联接。

答案 2 :(得分:0)

select team.team_name,count(*) as managers,
        group_concat(m_name separator ',') as managers_names 
    from team left join manager on manager.team_id=team.team_id 
    group by team.team_id having managers > 1;