【问题标题】:Select Users by Total Submissions按提交总数选择用户
【发布时间】:2009-02-06 13:14:24
【问题描述】:

我知道这很容易,但它让我发疯了......

我有一个用户表、cmets 表和图片表。

我想要一个基于提交的前 10 名用户的列表(他们的 cmets 和他们提交的照片的总和)。

就是这样。

让我感到羞耻。


更新:基于 Ed 的回答。

这是我的设置:

  • 用户表(user_id,用户名)
  • 图片表(img_id,submitby_id = users.user_id)
  • cmets 表(id​​,submitby_id = users.user_id)

最后的查询:

    select submittedby_id, sum(total)
from 
    (select submittedby_id, count(img_id) as total from    
          images group by submittedby_id 
     union 
     select submittedby_id, count(id) as total from 
          comments group by submittedby_id
    ) as x
 group by submittedby_id 
 order by sum(total) desc limit 10;

【问题讨论】:

    标签: mysql


    【解决方案1】:

    也许是这样的:

    select username, sum(submissions) 
    from 
        (select username, count(picture_id) from    
              pictures group by username 
         union 
         select username, count(comment_id) from 
              comments group by username
        )
     group by username 
     order by sum(submissions) desc limit 10;
    

    从概念上概述:

    1. 统计每个表中用户的提交次数
    2. 联合这些,因此每个用户将有 0 到 2 个子查询的计数。
    3. 再分组一次,将两个计数相加,然后排序,使最高数量在顶部。

    希望这会有所帮助。

    【讨论】:

    • #1248 - 每个派生表都必须有自己的别名...我是否在某处遗漏了“as z”?
    • 是的,只需在右括号之后和 group by 之前添加一个“as x”。这是正确的答案。
    【解决方案2】:

    当然是伪代码,但你想要这样的东西:

    select 
      u.userid
    , count(commentID) + count(photoID) as totalsubmissions 
    from users u
    left outer 
        join comments c
        on u.userid = c.userid 
    left outer 
        join pictures p 
        on u.userid = p.userid 
    group by 
        u.userid 
    order by 2 desc 
    fetch first 10 rows only
    

    【讨论】:

    • "totalsubmissions" 计数会出错,因为 cmets 和图片之间存在笛卡尔积。不过,如果只需要对排名靠前的用户进行排序,这可能没问题。
    • 啊,你是对的。 Ed 的帖子实际上是更准确的方法。
    【解决方案3】:

    调整 Ed 的答案:

    select submittedby_id, sum(submissions) 
    from 
        (select submittedby_id, count(img_id) as submissions from    
              images group by submittedby_id 
         union all
         select submittedby_id, count(id) as submissions from 
              comments group by submittedby_id
        ) as x
     group by submittedby_id 
     order by sum(submissions) desc limit 10
    

    我相信你想在这里做一个联合,只是联合可以省略看起来相同的记录(相同的 id 和提交计数)。

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 1970-01-01
      • 2019-10-29
      • 1970-01-01
      • 1970-01-01
      • 2016-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多