2

私の質問はこれに似ています: 行を比較してパーセンテージを取得する

ただし、少し異なります。私は自分の質問を他の投稿に適合させました。

私は2つのテーブルを手に入れました。

最初のテーブル:

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

そして2番目のテーブル:

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

それでは、2 番目の表で、各投稿の評価を数えたいと思います。評価に 50% 以上の肯定的な評価がある場合は、post_id を取得し、それをテーブル 1 から post_id に移動して、user_id に 1 を追加します。

最後に、肯定的な投稿の数とともに 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の数が全体の評価の半分以上である肯定的な投稿です。上に投稿した他のスレッドから、基本的に同じこと。

1 つ忘れていました: posts テーブルに 1 つの post_id が存在する可能性もありますが、ratings_table には評価がありません。それらの投稿も役立つと見なされます。評価としてのケースnullは、私の側の誤解でした。

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 フィドルのデモ

1^評価のないuser_id に投稿を追加したことに注意してください。それらはユーザーの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 に答える