我有一个类似于SO的网站的两个表:一个有帖子,一个有每个帖子的上/下投票。我想选择在帖子被修改的那天投票的所有选票。
我的表格布局如下所示:
文章:
-----------------------------------------------
| post_id | post_author | modification_date |
-----------------------------------------------
| 0 | David | 2012-02-25 05:37:34 |
| 1 | David | 2012-02-20 10:13:24 |
| 2 | Matt | 2012-03-27 09:34:33 |
| 3 | Peter | 2012-04-11 19:56:17 |
| ... | ... | ... |
-----------------------------------------------
投票(每次投票仅在当天结束时才算匿名):
-------------------------------------------
| vote_id | post_id | vote_date |
-------------------------------------------
| 0 | 0 | 2012-01-13 00:00:00 |
| 1 | 0 | 2012-02-26 00:00:00 |
| 2 | 0 | 2012-02-26 00:00:00 |
| 3 | 0 | 2012-04-12 00:00:00 |
| 4 | 1 | 2012-02-21 00:00:00 |
| ... | ... | ... |
-------------------------------------------
我想要实现的目标:
-----------------------------------
| post_id | post_author | vote_id |
-----------------------------------
| 0 | David | 1 |
| 0 | David | 2 |
| 1 | David | 4 |
| ... | ... | ... |
-----------------------------------
我已经能够编写以下内容,但它会在之前选择所有投票修改后的日期,而不是在同一天(因此,在此示例中为空表):< / p>
SELECT Posts.post_id, Posts.post_author, Votes.vote_id
FROM Posts
LEFT JOIN Votes ON Posts.post_id = Votes.post_id
WHERE CAST(Posts.modification_date AS DATE) = Votes.vote_date;
如何修复它以使WHERE
子句在Votes.vote_date
之前的一天?或者,如果不可能,还有另一种方式吗?
答案 0 :(得分:1)
如果您的站点类似于Stack Overflow,那么您也可以使用SQL Server:
SELECT p.post_id, p.post_author, v.vote_id
FROM Posts p LEFT JOIN
Votes v
ON p.post_id = v.post_id
WHERE CAST(DATEDIFF(day, -1, p.modification_date) AS DATE) = v.vote_date;
不同的数据库有不同的方法减去一天。如果这不起作用,那么您的数据库就会有类似的东西。
答案 1 :(得分:1)
取决于您使用的数据库类型(SQL,Oracle等等);要获取前几天的投票,您通常可以从日期中减去1,它将减去1天:
Where Cast(Posts.modification_date - 1 as Date) = Votes.vote_date
或者如果modification_date已经是日期格式:
Where Posts.modification_date - 1 = Votes.vote_date
答案 2 :(得分:1)
我找到了另一个解决方案,即向Posts.modification_date
添加一天:
...
WHERE CAST(CEILING(CAST(p.modification_date AS FLOAT)) AS datetime) = v.vote_date