0

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

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

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

  1. SELECT 和 COUNT 用户在评论表中提交的评论数。
  2. SELECT 和 COUNT 用户在 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 | (这里的简单想法是一个用户正在投票给另一个用户的帖子)

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

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

用户名 | # 评论

富 | 2

酒吧 | 1

foo2 | 1

用户名 | # 赞成票

富 | 1

foo2 | 1

用户名 | 总和

富 | 3

酒吧 | 1

foo2 | 2

4

3 回答 3

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
于 2013-11-04T23:04:33.577 回答
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 工作所必需的。

于 2013-11-04T23:24:34.670 回答
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

结果会是这样:

富 2 1 3

富2 1 1 2

酒吧 1 0 1

于 2013-11-05T00:35:22.373 回答