MySQL - 如何组合三个表来获取计数

时间:2021-07-08 16:36:18

标签: mysql sql join correlated-subquery

一共有三个表,我想得到一个用户的推文总数和他收到的推文总数。

我试图结合两个查询来获得我想要的但失败了。之前的几个问题都看了,还是没搞明白。

  • 用户表
<头>
id 姓名
1 用户 1
  • 推文表
<头>
id UserId(外键) 内容
1 用户 1 你好
  • 喜欢表
<头>
id UserId(外键) TweetId(外键)
1 用户 1 你好

第一次查询:

SELECT Users.name, Users.id, COUNT(Tweets.UserId) AS UserTweetCount FROM Users
LEFT JOIN Tweets
ON Users.id = Tweets.UserId
GROUP BY Users.id
ORDER BY UserTweetCount DESC;

enter image description here

第二次查询:

SELECT Users.name, Users.id, COUNT(Likes.UserId) AS UserTweetBeLikedCount FROM Users
LEFT JOIN Likes
ON Users.id = Likes.UserId
GROUP BY Users.id;

enter image description here

我像下面这样尝试,但会得到错误的 UserTweetBeLikedCount 计数。计数将是 UserTweetCount 的,而不是 UserTweetBeLikedCount 的。当我分别运行两个查询时,它运行良好。但是当我将它们组合在一起时,它不起作用。 不知道如何显示正确的计数。有人可以给我一些提示来解决这个问题吗?

SELECT Users.name, Users.id, 
COUNT(Tweets.UserId) AS UserTweetCount, COUNT(Likes.UserId) AS UserTweetBeLikedCount 
FROM Users
LEFT JOIN Tweets
ON Users.id = Tweets.UserId
LEFT JOIN Likes
ON Users.id = Likes.UserId
GROUP BY Users.id
ORDER BY UserTweetCount DESC;

enter image description here

1 个答案:

答案 0 :(得分:2)

我建议为此使用相关子查询:

SELECT u.*,
       (SELECT COUNT(*)
        FROM Tweets t
        WHERE u.id = t.UserId
       ) AS UserTweetCount,
       (SELECT COUNT(*)
        FROM Likes l
        WHERE u.id = l.UserId
       ) AS UserLikeCount
FROM Users u
ORDER BY UserTweetCount DESC;

注意:为了性能,您需要在 Tweets(UserId)Likes(UserId) 上建立索引。

相关问题