SQLの質問があります。まず第一に、SQLだけでも可能かどうかを知りたいのですが、そうでない場合は、良い回避策を知っている人はいません。
ユーザーが動画に投票できるサイトを構築しています。
ユーザーは、SMS で投票するか、Facebook 認証後にサイトで直接投票できます。
すべての動画のトップ リストを作成し、各動画のリストの「位置」を計算する必要があります。
これまでのところ、次のような単純なサブクエリでそれを行ってきました。
SELECT v.video_id AS id,
(SELECT (COUNT(*)+1) FROM videos AS v2
WHERE (v2.SMS_votes + v2.facebook_votes) > (v.SMS_votes + v.facebook_votes)) AS total_position
FROM videos AS v
SMS_votes
およびfacebook_votes
は集約されたフィールドです。投票の種類ごとに個別のテーブルがあり、投票が設定された時間を含む各投票の記録があります。
これは正常に機能し、順位が計算されます... 2 つ以上の動画の投票数が同じ場合、それらは順位を「共有」します。
残念ながら、位置の共有はあり得ないため、次のルールに従って解決する必要があります。
- 2 つの動画の投票数が同じ場合は、SMS 投票の多い方が有利です。
- それらが同じ数の SMS 票を持っている場合、過去 1 時間でより多くの SMS 票を持っている方が有利です。
- 過去 1 時間の SMS 投票数も同じ場合、前の 1 時間ごとに比較され、2 つに差が出るまで再帰的に比較されます。
この種の再帰的な順序付けを SQL でのみ行うことは可能ですか、それともコードで手動で解決する必要がありますか? すべてのアイデアを歓迎します。トップリストはサイト全体で使用されるため、ここではパフォーマンスが重要です。