【问题标题】:Need help writing SQL SELECT statement that combines two tables需要帮助编写组合两个表的 SQL SELECT 语句
【发布时间】:2019-12-26 23:21:25
【问题描述】:

我有两个表:team 和 team_member。 team_member 表显示了哪个用户是哪个团队的成员。

+---------+------------+
| team_id |    name    |
+---------+------------+
|       1 | Marketing  |
|       2 | New Launch |
|       3 | Sales      |
+---------+------------+

+---------+---------+  
| user_id | team_id |  
+---------+---------+  
|      21 |       2 |  
|    4369 |       1 |  
|    4369 |       2 |  
|    4369 |       3 |  
|     100 |       1 |  
|      21 |       1 | 
+---------+---------+ 

我需要一个查询,告诉我给定 user_id 所属的所有团队的 team_id 和团队名称,以及(这是困难的部分)每个团队中所有成员的计数。

对于上述数据,如果我们查看用户 21,我希望看到以下输出,因为用户 21 是团队 1 和团队 2 的成员,团队 1 有 3 名成员,团队 2 有 2 名成员。

+---------+------------+-------+
| team_id |    name    | count |
+---------+------------+-------+
|       1 | Marketing  |     3 |
|       2 | New Launch |     2 |
+---------+------------+-------+

知道如何在 SQL 中执行此操作(最好是 MySQL,如果这会有所不同)?获取前 2 列没有问题(见底部),但我不知道如何添加计数。谢谢!

SELECT team.team_id, team.name
FROM team
LEFT JOIN team_member ON team.team_id = team_member.team_id
WHERE team_member.user_id = 21

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    你可以用team加入team_member两次,然后聚合:

    SELECT t.team_id, t.name, COUNT(mm.user_id) count
    FROM team_member m
    INNER JOIN team t ON t.team_id = m.team_id
    INNER JOIN team_member mm ON mm.team_id = t.team_id
    WHERE m.user_id = 21
    GROUP BY t.team_id, t.name
    

    请参阅demo
    结果:

    | team_id | name       | count |
    | ------- | ---------- | ----- |
    | 1       | Marketing  | 3     |
    | 2       | New Launch | 2     |
    

    【讨论】:

    • 我很头疼,试图想象自己加入一个表,但这个答案看起来最好。谢谢。
    • 自连接是常见的做法。
    【解决方案2】:
    SELECT team.team_id, team.name, count(team_member.team_id)
    FROM team
    INNER JOIN team_member ON team.team_id = team_member.team_id
    GROUP BY (team.team_id, team.name)
    WHERE team_member.user_id = 21
    

    【讨论】:

      【解决方案3】:

      您可以使用数据透视查询。

      SELECT t.team_id,
             MAX(IF(m.user_id = 21, t.name,  NULL)) AS name,
             COUNT(m.user_id) AS count
      FROM team t
      JOIN team_member m ON t.team_id = m.team_id
      GROUP BY t.team_id
      HAVING name IS NOT NULL
      

      如果在团队中找到 21,则仅从聚合数据生成团队名称列。

      输出:

      team_id |    name    | count
         1    | Marketing  |   3
         2    | New Launch |   2
      

      【讨论】:

        【解决方案4】:

        count(teamid) 然后按名称或 teamid 分组,然后您将需要做有而不是按 teamid 或名称过滤的位置。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多