MySQL 对连接表的计数

标签 mysql sql join

我有一个用户表,如下(简写):

id (BIGINT)
username (VARCHAR)
recommendedByUserId (BIGINT)

recommendedByUserId中存储推荐者的ID,这是推荐者的users.id值。这是有效的:

SELECT u.username, recomm.recommCount, recomm.likesCount
FROM users u
INNER JOIN
(
    SELECT recommendedByUserId as rid, COUNT(*) as recommCount, SUM(u.likes) as likesCount
    FROM users u 
    GROUP BY recommendedByUserId
) recomm on recomm.rid = u.id
ORDER BY recomm.recommCount DESC

现在我还需要计算一个用户拥有多少个由另一个用户推荐的帖子,并将其汇总到推荐器上。我想我可以这样做:

SELECT u.username, recomm.recommCount, recomm.likesCount, recomm.postsCount
FROM users u
INNER JOIN
(
    SELECT recommendedByUserId as rid, COUNT(*) as recommCount, SUM(u.likes) as likesCount, COUNT(posts.id) AS postsCount
    FROM users u 
    INNER JOIN posts ON u.id = posts.author_id
    GROUP BY recommendedByUserId
) recomm on recomm.rid = u.id

ORDER BY recomm.recommCount DESC

但这会产生奇怪的结果。

感谢您的任何意见!

最佳答案

这可能就是您想要的:

SELECT u.username, p.postsCount, recomm.recommCount, recomm.likesCount
FROM users u 
JOIN
 (
   SELECT author_id, COUNT(*) AS postsCount
   GROUP BY author_id
 )  AS p
ON u.id = p.author_id
JOIN
 (
   SELECT recommendedByUserId as rid, COUNT(*) as recommCount, SUM(u.likes) as likesCount
   FROM users u 
   GROUP BY recommendedByUserId
 ) recomm ON recomm.rid = u.id
ORDER BY recomm.recommCount DESC

关于MySQL 对连接表的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18826457/

相关文章:

Mysql创建 View 并逐渐增加日期时间字段

sql - 如何制作可重复的索引脚本?

python - 在 SQLAlchemy 中连接表时,是否有一种方便的方法来仅对冲突的列进行别名?

php - 在 PHP 和 mySQL 中更改用户密码

mysql - 在 MySQL 中按 desc 排序

php - 如何查找速记或标准版本的地址? N 或北、NW 或西北

sql - 100+ table 加入

php - MySQL 文本数据被某些符号截断

MySQL 按分隔符分割字符串的函数不适用于波兰语特殊字符

sql - 在 In 子句中传递时获取不在表中的记录?