我的问题与此类似: 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
作为评级的案例是我的误解。
答案 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
^注意我向没有评分的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