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

问题描述

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

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

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,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,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

解决方法

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...