需要帮助编写组合两个表的 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 语句的主要内容,如果未能解决你的问题,请参考以下文章