如果百分比高于特定值,则连接表

时间:2012-07-08 20:58:14

标签: mysql sql

我的问题与此类似: Compare rows and get percentage

但是,差别不大。我把我的问题改编到另一篇文章。

我有两张桌子。

第一张表:

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并将其从表1转到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_ids数量超过整体评级的一半。基本上是同样的事情,来自我上面发布的其他帖子。

忘了一件事: 还有可能在posts表中存在一个post_id,但在ratings_table中没有对它进行评级。这些帖子也很有用。 null作为评级的案例是我的误解。

3 个答案:

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

^注意我向没有评分的user_id 1添加了帖子,并将这些信息计入用户的helpfulPosts

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

而不是查询中的版本。

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