我有一个 SQL 问题。首先,我想知道仅使用 SQL 是否有可能,如果没有,是否有人知道一个好的解决方法。
我们正在建立一个网站,用户可以在其中为视频投票。
用户可以通过短信方式投票,也可以在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 个或更多视频具有相同的票数,他们会“分享”该位置。
不幸的是,不能共享位置,我们必须通过以下规则来解决它:
- 如果两个视频的票数相同,短信票数多的视频有优势
- 如果他们也有相同数量的短信投票,最后一小时短信投票多的有优势
- 如果最后一小时的短信投票数也相同,则按前一小时进行比较,并如此递归,直到两者之间存在差异
是否可以仅在 SQL 中进行这种递归排序,或者我们必须在代码中手动解决这个问题?欢迎所有想法。请注意,性能在这里很重要,因为整个站点都在使用顶部列表。