当コミュニティは、ピン留めされたトピックとグローバルにピン留めされたトピックを中心に構成されています。残念ながら、ユーザープロフィールページにはこれらの統計カウントが一切表示されておらず、データベース内にもピン留めやグローバルピン留めが体系的に保存されている箇所はないようです。
この状況を踏まえ、少なくとも「初回ピン留め」「10 回ピン留め」「100 回ピン留め」、ならびに「グローバルにピン留めされたトピック」に対してバッジを付与する方法を探しています。
これらのバッジに対応する SQL クエリについて、どなたかお手伝いいただけますでしょうか?
私の着手点は以下の通りです:
SELECT p.user_id, min(p.created_at) granted_at, MIN(p.id) post_id
FROM badge_posts p
JOIN topics t ON t.id = p.topic_id
WHERE t.unpinned IS NOT NULL
GROUP BY p.user_id
HAVING count(*) > 5
しかし、このクエリを実行すると以下のエラーが発生します:
ERROR: column t.unpinned does not exist
LINE 6: WHERE t.unpinned IS NOT NULL
おそらく、unpinned フィールドを使用する必要があるのでしょう。少なくとも私の知る限り、一度ピン留めされたトピックに付随する他のデータポイントはないためです。あるいは、ここで post_actions を利用することは可能でしょうか?
あるいは、スタッフやシステムユーザーによって作成されたトピック内の最初の投稿で「pinned … ago」という文字列を含むものを検索し、カウントする方法はいかがでしょうか?action_code => pinned.disabled
追記:どうやらこれは機能するようです…
SELECT t.user_id, current_timestamp granted_at
FROM badge_posts p
INNER JOIN topics t on t.id = p.topic_id
WHERE p.action_code ilike 'pinned.disabled'
GROUP BY t.user_id
HAVING count(*) > 0
ただし、これが最善のアプローチかどうかは確信が持てません。また、トピックが複数回ピン留め・ピン留め解除される可能性があるため、このクエリが各 topic.id に対して「pinned.disabled」を 1 回のみ検出しているのかどうかも不明です。
バッジ SQL のエキスパートの方のご助言をいただければ幸いです。
あるいは、今後「いいね」などと同様に、ピン留め情報をデータベースに体系的に保存し、ユーザープロフィールの統計セクションやその下に「GOT PINNED」というリンク付きで表示することを検討してはいかがでしょうか。トピックがピン留めされることは、単なる「いいね」よりもはるかに高い評価を表すものであり、適切にカウントされるべきだと考えています。
