【问题标题】:SUM of Multiple COUNTs on Different Tables不同表上多个 COUNT 的总和
【发布时间】:2013-11-04 23:01:10
【问题描述】:

这个话题似乎很受欢迎,并且在相关帖子的数量方面肯定已经饱和,但是,我已经为此工作了 3 天,但我无法弄清楚这一点。

我一直在搜索这个网站和许多其他可能的解决方案,其中一些正在执行,但我没有得到预期的结果。

这就是我想要做的......

  1. SELECT 并 COUNT 用户在评论表中提交的评论数。
  2. 选择并计算用户在 reviewVotes 表中的赞成票数。
  3. GROUP BY 用户名(这是两个表中的键 - 用户名是唯一的,但存在于多行中)。
  4. 按这些 COUNTs DESC 的总和对结果集进行排序。 (这是我一直在尝试的,但甚至无法执行,所以我现在按 userReviewNum DESC 订购。)
  5. 将结果集限制为前 10 个。

结果集应该给我前 10 名评论者,这是根据评论数量加上 (+) 投票数计算得出的。

这是我执行的最新尝试,但似乎将 userReviewNum * reviewVotesNum 相乘,我需要它来添加它们(但我在任何尝试包含 SUM 命令时都非常不成功 - 事实上太糟糕了,我很尴尬甚至展示我的尝试)。

    SELECT
    reviews.username,
    count(reviews.username) userReviewNum,
    count(reviewVotes.username) reviewVotesNum
    FROM reviews 
    LEFT JOIN reviewVotes ON reviews.username = reviewVotes.username 
    GROUP by reviews.username
    ORDER BY userReviewNum DESC 
    LIMIT 0, 10

我尝试过使用 JOIN 和 UNION,但我似乎无法让它们中的任何一个工作。

非常感谢任何人提供的任何帮助!

更新:

这是结构和一些示例数据。

评论表(还有其他字段,但这些是重要的):

|用户名 |评论 |评级 |产品 ID |

|富 |这太棒了! | 5 | xxxx |

|酒吧 |我不喜欢这个| 1 | xxxx |

| foo2 |没关系 | 3 | xxxx |

|富 | bleh - 讨厌 | 1 | xxxx |

reviewVotes 表(同样,比这更多的字段,但这些是重要的):

|用户名 |选民用户名 |产品 ID |

|富 | foo2 | xxxx |

| foo2 |富 | xxxx | (这里的简单想法是一个用户正在为另一个用户的帖子投票)

所以我需要计算用户在评论表中的评论数,然后计算用户在 reviewVotes 表中的点赞数,然后按这两个数字的总和排序。

其他更新: 在上面的示例中,以下是预期结果:

用户名 | # 评论

富 | 2

酒吧 | 1

foo2 | 1

用户名 | # 赞成票

富 | 1

foo2 | 1

用户名 |总和

富 | 3

酒吧 | 1

foo2 | 2

【问题讨论】:

    标签: mysql join count


    【解决方案1】:

    尝试像这样计算不同的评论和投票:

    SELECT
      reviews.username,
      COUNT(DISTINCT reviews.id) AS userReviewNum,
      COUNT(DICTINCT reviewVotes.id) AS reviewVotesNum,
      COUNT(DISTINCT reviews.id) + COUNT(DICTINCT reviewVotes.id) AS userRating
    FROM 
      reviews 
      LEFT JOIN reviewVotes ON reviews.username = reviewVotes.username 
    GROUP by reviews.username
    ORDER BY userRating DESC 
    LIMIT 10
    

    【讨论】:

    • 谢谢 sashkello - 我今天早些时候尝试过,但最终给了我一个时髦的结果集,其中只包含 10 个用户的一行。或者至少结果集似乎可以做到这一点。
    • @Rmilligan2372 如果您运行的内容与您的帖子完全相同?除非您的表格不是我认为的那样,否则它应该可以工作 - 您可以发布一些数据样本以及您从查询中获得的信息?
    • 你打赌 - 给我几分钟,我会补充。
    • 这更接近了 - 我必须删除 DISTINCT 并且它正确地将两者作为 userRating 求和,但各个计数仍然以某种方式相互相乘,这导致 userRating 比它大得多实际上是。
    • @Rmilligan2372 DISTINCT 在这里至关重要。如果你使用它,你会得到什么?
    【解决方案2】:

    试试这个:

    SELECT username, SUM(userReviewNum + reviewVotesNum) AS userRank
    FROM (
        SELECT
        reviews.username,
        count(reviews.username) userReviewNum,
        count(reviewVotes.username) reviewVotesNum
        FROM reviews 
        LEFT JOIN reviewVotes ON reviews.username = reviewVotes.username 
        GROUP by reviews.username
        ORDER BY userReviewNum DESC 
        LIMIT 0, 10)
    AS result_set
    GROUP BY username
    

    我认为 SUM 需要该组才能工作。

    【讨论】:

    • 感谢 SamA - 结果集与我之前得到的结果有点相似,只是它仍然以令人难以置信的高 SUM 返回。用户 A 应该有 213 条评论和 149 条赞成票,总共 362 条,但结果集中返回的是 60,030。
    • 听起来像是在 SUM 语句中添加所有内容。尝试将 group by 更改为 group by 所有三个字段。
    【解决方案3】:

    试试这个:

    SELECT Res1.*, SUM(IF(reviewVotes.Username IS NULL,  0, 1))  AS UpVotes, 
    userReviewNum + SUM(IF(reviewVotes.Username IS NULL,  0, 1)) AS TotalSum FROM (
    SELECT username, Count(*) AS userReviewNum
    FROM reviews
    GROUP BY username) AS Res1
    LEFT OUTER JOIN reviewVotes ON res1.username = reviewVotes.username 
    GROUP BY Res1.username
    ORDER BY TotalSum DESC
    

    结果会是这样的:

    富 2 1 3

    foo2 1 1 2

    小节 1 0 1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 2013-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多