需要帮助编写组合两个表的 SQL SELECT 语句

Posted

技术标签:

【中文标题】需要帮助编写组合两个表的 SQL SELECT 语句【英文标题】:Need help writing SQL SELECT statement that combines two tables 【发布时间】: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

【问题讨论】:

【参考方案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 或名称过滤的位置。

【讨论】:

以上是关于需要帮助编写组合两个表的 SQL SELECT 语句的主要内容,如果未能解决你的问题,请参考以下文章

组合来自 2 个单独的 SQL 表的列数据

创建一个组合两个表的视图 ms sql server 2014

两个表的总和的sql总和

如何编写组合多个表的Oracle Sql Query

mysql 三表联合查询

SQL怎样合并显示两个没有关联的表