如何通过“按日期”,“按年”投票进行排序..?

时间:2012-12-19 09:01:43

标签: php mysql

我想要实现的内容与我们在SO上的内容类似。我想在最后一天,上个月用upvotes对帖子进行排名等。我的模式构成了两个表,

post(id, post, posted_on..)
vote(post_id, vote_value, date)

我希望架构非常自我解释。问题是,如果我通过在帖子上进行内部联接并投票并使用where子句(“votes.date >= DATE_SUB(CURDATE(), INTERVAL 1 DAY”)来“按天”排序,它确实按预期工作但未能显示其他帖子。我的意思是在最后一天没有投票的帖子完全被忽略了。我想要的是这些帖子的优先级较低,但会显示在查询中。

虽然,我可能会考虑使用联合操作,但我正在寻找另一种方法。

更新:可以说,有两个帖子,1,2。

和投票表就像,

post_id       vote_value      date
1              1              2012-12-19
2              1              2012-12-10

如果我查询,按照我的方法,那么只有帖子 - “1”会出现,因为我已经设置了日期约束,但我希望两者都显示出来。这是我的疑问:

SELECT `id`, SUM(`votes`.`votes`) AS likes_t, `post`.* FROM `posts` JOIN `votes` ON (`id` = `votes`.`post_id`) WHERE `votes`.`date` >= DATE_SUB(CURDATE(), INTERVAL 2 DAY) 

2 个答案:

答案 0 :(得分:2)

如果我做对了:

SELECT *, IF(vote.date>=DATE_SUB(CURDATE(), INTERVAL 1 DAY), 1, 0) as rate FROM post INNER JOIN vote ON (post.id=vote.post_id) ORDER BY rate DESC;

+------+--------+---------+------+---------------------+------+
| id   | post   | post_id | vote | date                | rate |
+------+--------+---------+------+---------------------+------+
|    1 | first  |       1 |    1 | 2012-12-19 00:00:00 |    1 |
|    1 | first  |       1 |    1 | 2012-12-13 00:00:00 |    0 |
|    2 | second |       2 |    1 | 2012-12-10 00:00:00 |    0 |
+------+--------+---------+------+---------------------+------+

答案 1 :(得分:2)

如果您想显示所有帖子,但只计算最近的投票数,则应该这样做:

SELECT `id`,
       SUM(IF(`votes`.`date` >= DATE_SUB(CURDATE(), INTERVAL 2 DAY, `votes`.`votes`, 0)) AS likes_t, 
       `post`.*
       FROM `posts` JOIN `votes` ON (`id` = `votes`.`post_id`)