2

我的问题与此类似: 比较行并获取百分比

不过,差别不大。我将我的问题改编为另一篇文章。

我有2张桌子。

第一张表:

user_id | post_id
1         1
1         2
1         3
2         12
2         15

第二张表:

post_id | rating
1         1
1         2
1         3 
2         1
2         5
3         1
3         1
3         4
12        4
15        1

所以现在我想在第二个表中计算每个帖子的评分。如果评级有超过 50% 的正面评级,那么我想要获取 post_id 并将其从表一中转到 post_id 并将 1 添加到 user_id。

最后,它将返回带有正面帖子数量的 user_id。

上表的结果将是:

user_id | helpfulPosts
1         2
2         1

post_id 为 1 和 3 的帖子有正面评价,因为超过 50% 的帖子有 1-3 的评价。id = 2 的帖子不是正面的,因为评分正好是 50%。

我将如何实现这一目标?

澄清一下:这是一个 mysql rdbm 和一个积极的帖子,是一个 1、2 和 3 的 rating_id 的数量超过整体评分的一半的帖子。基本上是一样的,来自我上面发布的另一个线程。

忘了一件事:也有可能posts表中存在一个post_id,但在ratings_table中没有评分。这些帖子也很有帮助。null评级为 as的情况对我来说是一个误解。

4

3 回答 3

1

试试这个解决方案:

SELECT
    a.user_id,
    COUNT(1) AS helpfulPosts
FROM
    posts a
LEFT JOIN
    (
        SELECT 
            post_id, 
            COUNT(CASE WHEN rating IN (1,2,3) OR rating IS NULL THEN 1 END) / COUNT(1) AS percent_positive
        FROM ratings
        GROUP BY post_id
    ) b ON a.post_id = b.post_id
WHERE
    b.post_id IS NULL OR
    b.percent_positive > 0.5
GROUP BY
    a.user_id

SQL-Fiddle 演示

^ 请注意,我向 user_id 添加了1没有评分的帖子,这些帖子被计入用户的helpfulPosts.

于 2012-07-08T21:09:06.843 回答
1

要解决这个问题,您需要首先弄清楚哪些帖子有帮助。使用您的逻辑,这只是在存在评级时计算平均评级。

select u.user_id, count(*) as HelpfulPosts
from UserPosts u join
     (select post_id,
             sum(case when rating in (1, 2, 3) then 1.0 else 0.0 end) / count(rating) as HelpfulRating 
      from PostRating pr
      group by post_id
     ) r
     on r.post_id = u.post_id
where r.HelpfulRating > 0.5
group by user_id

下一步是将其连接回用户帖子表,按用户 ID 分组,以计算有用帖子的数量。

顺便说一句,我看不出“3”如何被认为是有帮助的。你的意思是15而不是?上面的查询忽略了 NULL 评级。如果 NULL 应该被认为是有帮助的,那么使用:

             sum(case when coalesce(rating, 1) in (1, 2, 3) then 1.0 else 0.0 end) / count(*) as HelpfulRating 

而不是查询中的版本。

于 2012-07-08T21:09:26.927 回答
1
select up.user_id, count(up.post_id) as helpfulPosts
from userposts as up
where up.post_id in (
    select pr.post_id
    from postratings as pr
    group by pr.post_id
    having
        sum(case when pr.rating between 4 and 5 then 0 else 1 end) > 
        sum(case when pr.rating between 4 and 5 then 1 else 0 end)
)
group by up.user_id
于 2012-07-08T21:09:39.517 回答