我想要实现的内容与我们在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)
答案 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`)