不同表上多个COUNT的总和

时间:2013-11-04 23:01:11

标签: mysql join count

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

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

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

  1. 选择并计算用户在评论表中提交的评论数。
  2. SELECT和COUNT用户在reviewVotes表中的最多投票数。
  3. GROUP BY用户名(这是两个表中的键 - 用户名是唯一的,但存在于多行中)。
  4. 按照那些COUNTs DESC的SUM排序结果集。 (这是我一直在尝试的东西,但是甚至无法执行,所以我现在正在通过userReviewNum DESC进行排序。)
  5. 将结果集限制为前10个。
  6. 结果集应该会给我排名前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,我似乎无法使其中任何一个工作。

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

    更新

    这是结构和一些样本数据。

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

    |用户名|评论|评级| productID |

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

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

    | foo2 |没关系3 | xxxx |

    | foo | bleh - 讨厌| 1 | xxxx |

    reviewVotes Table(再次,比这更多的字段,但这些是重要的):

    |用户名| voterUsername | productID |

    | foo | foo2 | xxxx |

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

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

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

    用户名| #评论

    foo | 2

    吧| 1

    foo2 | 1

    用户名| #Up-Votes

    foo | 1

    foo2 | 1

    用户名|总和

    foo | 3

    吧| 1

    foo2 | 2

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

试试这个:

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才能工作。

答案 2 :(得分:0)

试试这个:

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

Vic G。

我是新来的。不知何故,我保存时会自动删除星号。它应该是Res1.asterisk

结果就是这样:

foo 2 1 3

foo2 1 1 2

bar 1 0 1