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

问题描述 投票:0回答:2

有三个表,我想获取用户的推文总数和他的推文总数收到的点赞数。

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

  • 用户表
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's,而不是 UserTweetBeLikedCount's。当我分别运行两个查询时,效果很好。但是当我将它们组合在一起时,它就不起作用了。 不知道如何显示正确的计数。有人可以给我提示来解决这个问题吗?

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

mysql sql join correlated-subquery
2个回答
3
投票

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

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)
上建立索引。


0
投票

选择你。, (选择计数() 来自推文 其中 u.id = t.UserId ) 作为用户推文计数, (选择计数(*) 来自 喜欢 l 其中 u.id = l.UserId ) 作为用户喜欢计数 来自用户 u 按 UserTweetCount DESC 排序;

© www.soinside.com 2019 - 2024. All rights reserved.