大規模ですが、やや単純な SQL クエリがあります。基本的に、私のサイトのユーザーは、レビューを書いたり、コメントを残したり、データベースにエントリを追加したりするなど、さまざまな種類の活動に対して評判を築いています. ほとんどの場合、これらのポイントは reputable_actions テーブルに格納されており、reputable_actions テーブルを繰り返し LEFT JOIN することでそれらを取得します。これはずさんな感じがしますが、ほとんどの場合うまくいきます。
私が経験している問題は、「レビュアー」と「コミュニティ」という 2 つのレピュテーションに関するものです。他のものとは異なり、reputable_actions テーブルには保存されません。代わりに、それらの値は、最初にコメント テーブルを LEFT JOIN することによってアクセスする、votes テーブルから派生します。何らかの理由で、コメント テーブルに参加すると、他のすべての評判が指数関数的に増加します。ある試行では、「アーキビスト」の評価は 25 と想定されていましたが、私がコメントに参加すると、10050 に膨れ上がりました。
私は SQL の初心者で、知っていること (つまり、users.id に GROUP BY 句を適用すること) を試しましたが、まだ運がありませんでした。いくつかのガイダンスをいただければ幸いです。
SELECT users.*,
SUM(COALESCE(reviewers.value, 0)) as reviewer,
SUM(COALESCE(communities.value,0)) as community,
SUM(COALESCE(developers.value,0)) as developer,
SUM(COALESCE(moderators.value,0)) as moderator,
SUM(COALESCE(marketers.value,0)) as marketer,
SUM(COALESCE(archivists.value,0)) as archivist,
SUM(COALESCE(karmas.value,0)) as karma
FROM `users`
LEFT JOIN comments AS impressions
ON impressions.user_id = users.id
AND impressions.type = 'impression'
LEFT JOIN comments AS replies
ON replies.user_id = users.id
AND replies.type = 'reply'
LEFT JOIN votes AS reviewers
ON reviewers.voteable_type = 'impression'
AND reviewers.voteable_id = impressions.id
LEFT JOIN votes AS communities
ON communities.voteable_type = 'reply'
AND communities.voteable_id = replies.id
LEFT JOIN reputable_actions AS developers
ON developers.reputation_type = 'developer'
AND developers.user_id = users.id
LEFT JOIN reputable_actions AS moderators
ON moderators.reputation_type = 'moderator'
AND moderators.user_id = users.id
LEFT JOIN reputable_actions AS marketers
ON marketers.reputation_type = 'marketer'
AND marketers.user_id = users.id
LEFT JOIN reputable_actions AS archivists
ON archivists.reputation_type = 'archivist'
AND archivists.user_id = users.id
LEFT JOIN reputable_actions AS karmas
ON karmas.reputation_type = 'karma'
AND karmas.user_id = users.id
GROUP BY users.id