8

我试图实现的与我们在 SO 上的类似。我想按最后一天、上个月等的投票对帖子进行排名。我的架构由两个表组成,

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) 
4

2 回答 2

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 |
+------+--------+---------+------+---------------------+------+
于 2012-12-19T09:29:00.240 回答
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`)
于 2012-12-19T09:29:08.113 回答