【问题标题】:MySQL order results by the sum of two relations count(*)MySQL排序结果由两个关系计数的总和(*)
【发布时间】:2016-11-30 22:23:07
【问题描述】:

我想按两个相关表条目的计数(*)对结果进行排序。

所以我想获得具有更多 cmets + 帖子交互的排名最高的用户 ID。


用户表:
ID Name @ 987654323@
1 Jonh
2 @ 987654327@
3 King
4 Doe kbd>

发布表:
ID USER_ID@ 987654334@
1 1
2 @ 987654338@
3 3
4 1 kbd>

评论表:
ID USER_ID@ 987654345@
1 1
2 @ 987654349@
3 1
4 4 kbd>


按帖子数排序(*):

SELECT user.*, COUNT(post.user_id) AS count FROM user
LEFT JOIN post ON user.id = post.user_id
GROUP BY user.id
ORDER BY count DESC

按评论数排序(*)

SELECT user.*, COUNT(comment.user_id) AS count FROM user
LEFT JOIN comment ON user.id = comment.user_id
GROUP BY user.id
ORDER BY count DESC

按帖子排序+评论计数(*)

预期结果: user_id:1(四次交互),3(两次交互),4(一次交互)

【问题讨论】:

    标签: mysql


    【解决方案1】:
    SELECT u.*, COUNT(interact.user_id)
    FROM user u
    LEFT JOIN  ( SELECT user_id  FROM post
                 UNION ALL
                 SELECT user_id  FROM comment 
               ) interact
     ON u.user_id = interact.user_id
    GROUP BY u.user_id
    

    如果你想要更多细节可以使用条件计数

    SELECT u.*, 
           COUNT(CASE WHEN source = 'p' then 1 END) as total_p,
           COUNT(CASE WHEN source = 'c' then 1 END) as total_c,
           COUNT(interact.user_id) as total_interact
    FROM user u
    LEFT JOIN  ( SELECT user_id, 'p' as source  FROM post
                 UNION ALL
                 SELECT user_id, 'c' as source  FROM comment 
               ) interact
     ON u.user_id = interact.user_id
    GROUP BY u.user_id
    

    【讨论】:

    • 用户表 200k 数据,发布表 500k 数据,评论表 900k 数据。我在真实数据库中尝试过,但两个查询都没有完成。
    • 您在所有表上都有 user_id 的索引吗?
    • 是的。用户(主键)、帖子(外键+索引)、评论(外键+索引)。
    • 可以分享一下解释计划吗?
    • 好吧,我猜没有:(
    猜你喜欢
    • 1970-01-01
    • 2011-06-28
    • 2013-11-08
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    相关资源
    最近更新 更多