编写复杂的MySQL Join查询

时间:2017-01-28 17:37:57

标签: mysql join left-join

对某些人来说这可能很简单,但我无法解决。

我有3张桌子:

团队,用户,标签

Teams                 Users                Tags
-------------------   ------------------   -----------------------
userID | teamUserID   userID  | username   userID  | name  | value
-------------------   ------------------   -----------------------
1      | 2            1       | dan        2       | myTag | 1
1      | 3            2       | bob        2       | aTag  | 2
1      | 4            3       | jon        3       | bTag  | 1
                      4       | rob        4       | cTag  | 5

每个团队中都可以包含多个用户,每个用户都可以拥有多个标签。

我需要一个查询,它将提供任何给定团队中的用户列表,以及他们拥有的标签总数。

因此,当我向团队1(dan团队)请求结果时,它应该返回:

-----------------------------------
userID  | username  | tagTotalValue
-----------------------------------
2       | bob       | 3
3       | jon       | 1
4       | rob       | 5

到目前为止,我有这个查询,但它只给了我一条记录,其中包含整个团队的总体记录,而不是团队中所有用户的总分别列表。

SELECT username, SUM(value) tagTotalValue
FROM users u LEFT JOIN tags t
ON u.userID = t.userID
WHERE u.userID IN (SELECT teamUserID FROM teams WHERE userID = 1)

帮助!

如果有人能够解释如何构建这些查询的好方法,我将非常感谢您的学习。我只需要做一个mySQL课程,还是我可以采用一种简单的方法?

1 个答案:

答案 0 :(得分:2)

  

我需要一个查询,它会在任何给定的团队中提供用户列表,   他们拥有的标签总数。

这似乎与您编写的查询没什么关系。您应该首先将三个表连接在一起然后进行聚合。查询看起来像这样:

SELECT t.teamId, u.userId, u.username, count(ta.userId) as numTags
FROM teams t JOIN
     users u 
     ON t.teamUserID = u.UserId LEFT JOIN
     tags ta
     ON u.userID = ta.userID
WHERE t.teamId = @teamId  -- this can be removed
GROUP BY t.teamId, u.userId, u.username;

此查询突显了teams有一个标识该小组的列 - 例如teamId