我有一张桌子,里面装满了文章。出于这篇文章的目的,我们可以说它有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查询中使用这些时间戳来实现所需的结果。
答案 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
。
如果您希望对结果进行排序,最好在单独的查询中执行此操作,而不是尝试在单个查询中执行此操作。因为三个时期中的每一个的排序顺序可能非常不同。