什么是在php / mysql中实现基于时间的排序的最佳方法?

时间:2009-04-11 00:16:05

标签: php mysql

我有一张桌子,里面装满了文章。出于这篇文章的目的,我们可以说它有4个字段。 story_id,story_title,story_numyes,story_numno

每篇文章都可以选为YES或NO。我将每个评级存储在另一个表中,其中包含3个字段:vote_storyid,vote_date(作为时间戳),vote_code(1 =是,0 =否)。

因此,当有人对某篇文章投赞成票时,会对story_numyes + 1运行更新查询,并在第2个表中记录插入查询以记录故事ID,日期和vote_code。

我想根据它有多少YES或NO票来对文章进行排序。对于“最好的所有时间”评级显然很简单.... ORDER BY story_numyes DESC。

但是,本周,本月,我将如何做最好/最糟糕的文章?

我通过以下方式获取时间戳以标记每个时段的截止日期:

$yesterday= strtotime("yesterday");
$last_week = strtotime("last week");
$last_month = strtotime("last month");

但我不确定如何在mysql查询中使用这些时间戳来实现所需的结果。

3 个答案:

答案 0 :(得分:3)

尝试类似

的内容
  

SELECT id,
           SUM(投票时> = $昨天,然后1,结束0)作为日期,
       SUM(投票时的情况> = $ last_week那么1节0结束)AS周数,
       SUM(1)AS月份
  来自投票   WHERE yes_no ='YES'
  AND votedate> = $ last_month
  GROUP BY id

然后将其作为子查询,您可以获得计数的最大值。

(请考虑未经测试的查询中固有的通常语法邋。。)


回应评论:

将其用作有效的子查询(即不相关)以获得最大值:

  

选择
      MAX(daycount)AS MaxDayCount,
      MAX(周数)AS MaxWeekCount,
      MAX(monthcount)AS MaxMonthCount
      从
      (
        ......那些东西......
      )AS qcounts

但当然你不能将它们归因于ID,因为它们是不同的。如果你想一次一个地使用id,你可以

  

SELECT id,monthcount
    从
    (
      ......那些东西......
    )AS qcounts
  ORDER BY monthcount DESC
  限制1

并且做三次,每天一次/每周一次。

注意:这只是为了说明您可以在一个合理有效的查询中完成的一些事情。如果你发现最简单(和简单= =好)的话就像其他人所说的那样分解它,我不会感到惊讶。

答案 1 :(得分:2)

一般来说:

select story_id, sum(vote_code)
from story_vote
group by story_id;

对于特定的投票日期范围:

select story_id, sum(vote_code)
from story_vote
where vote_date >= 'least date, inclusive' 
and vote_date < 'last date, exclusive'
group by story_id;

OP评论:

  

我如何使用ORDER BY子句?

您要添加order by sum(vote_code)。如果你想要首先获得最多票数的故事,那就下降:

order by sum(vote_code) desc;

编辑:我注意到他想要所有的故事,而不是一个,所以我要删除有条款。

答案 2 :(得分:0)

SELECT a.*, SUM(vote_code) AS votes
FROM articles a JOIN votes v ON (a.story_id = v.vote_storyid)
WHERE v.vote_date >= $yesterday
GROUP BY a.story_id
ORDER BY 2 DESC;

同样适用于$last_week$last_month

如果您希望对结果进行排序,最好在单独的查询中执行此操作,而不是尝试在单个查询中执行此操作。因为三个时期中的每一个的排序顺序可能非常不同。