MySQL最后一小时按计数排序递归

MySQL最后一小时按计数排序递归,mysql,sql,datetime,sql-order-by,Mysql,Sql,Datetime,Sql Order By,我有一个SQL问题。首先,我想知道的是,仅仅使用SQL是否可行,如果没有,是否有人知道一个好的解决方法 我们正在建设一个网站,用户可以在这里投票选择视频。 用户可以通过短信或Facebook认证后直接在网站上投票。 我们必须列出所有视频的列表,并计算每个视频在列表中的“位置” 到目前为止,我们已经通过一个简单的子查询实现了这一点,如下所示: SELECT v.video_id AS id, (SELECT (COUNT(*)+1) FROM videos AS v2

我有一个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\u投票
facebook\u投票
是聚合字段。每种投票都有单独的表格,每个投票都有记录,包括设定投票的时间

这很好,位置是经过计算的。。。如果两个或两个以上的视频拥有相同的投票数,则它们“共享”该位置

不幸的是,不能共享职位,我们必须通过以下规则解决此问题:

  • 如果两个视频的票数相同,则短信票数较多的视频占优势
  • 如果他们也有相同数量的短信投票,那么在最后一个小时内有更多短信投票的人就有优势
  • 如果他们在最后一个小时内也有相同数量的短信投票,他们将在前一个小时进行比较,并以此递归,直到两者之间出现差异

是否可以只在SQL中执行这种递归排序,或者我们必须在代码中手动解决这种问题?欢迎所有想法。需要注意的是,性能在这里很重要,因为排名靠前的列表在整个网站上都有使用。

我认为通过递归计算(这可能是无限的)来执行这种排序是不可行的,但是如果你愿意限制回顾的时间,有一些方法可以做到

这里有一种可能性

SELECT video_id,
  SMS_votes + facebook_votes AS total_votes,
  SMS_votes,
  COUNT(CASE WHEN time > NOW() - INTERVAL 1 HOUR THEN 1 END) AS h1,
  COUNT(CASE WHEN time > NOW() - INTERVAL 2 HOUR THEN 1 END) AS h2,
  COUNT(CASE WHEN time > NOW() - INTERVAL 3 HOUR THEN 1 END) AS h3
FROM videos
JOIN SMS_votes USING(video_id)
GROUP BY video_id
ORDER BY total_votes DESC, SMS_votes DESC, h1 DESC, h2 DESC, h3 DESC;
这假设您有一个名为SMS_votes的表,用于跟踪每个投票,其中包含一个视频id字段和一个时间字段

对于每个视频,它计算总票数、短信票数、过去一小时、过去两小时和过去三小时的短信票数。然后对所有这些值执行
排序,以获得正确的位置

这很容易扩展到包括更宽的时间范围,但是你也可以考虑随着时间的推移使用一个不断增加的时间范围。例如,您首先查看过去一小时内的投票,然后查看过去一天内的投票,然后查看过去一周内的投票,等等。我怀疑这会降低您的视频获得相同投票的机会,而无需添加太多额外的计算


如何在其他表格中存储特定视频的短信投票和投票时间?换句话说,添加查询,该查询将给出给定视频在给定时间内的短信投票数。是。还有两个表格,一个用于短信投票,一个用于facebook Votest。这很简单,但不幸的是不能接受。我们不能把它限制在几段时间内