【发布时间】:2013-07-04 15:36:42
【问题描述】:
我有一个 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 中进行这种递归排序,或者我们必须在代码中手动解决这个问题?欢迎所有想法。请注意,性能在这里很重要,因为整个网站都在使用顶部列表。
【问题讨论】:
-
您如何将给定视频的短信投票和投票时间存储在其他表中?换句话说,添加查询,该查询将给出给定视频在给定小时内的 SMS 投票数。
-
是的。还有2张桌子,一张短信投票,一张脸书投票
标签: mysql sql datetime sql-order-by