使用仅具有今天日期排序的行的SQL连接查询

时间:2011-08-18 00:50:58

标签: mysql sql

我确信这很简单......现在就累了。

我有一个查询

SELECT post.*, votes.datetime, COUNT(votes.post_id) AS votes        
FROM posts LEFT JOIN votes          
ON posts.id = votes.post_id         
GROUP BY posts.id       
ORDER BY votes DESC

我需要在左表上获取所有帖子,同时使用今天发生的 或1小时到另一小时之间的投票在投票表上计票同一天。这有足够的意义吗?

我尝试过添加

WHERE DATE(votes.datetime) = DATE(NOW())

但是没有运气,它只是显示今天发生了投票的行,没有其他任何一行都没有投票或今天发生的投票。

我正在使用数据类型datetime作为日期时间列

我有什么想法可以轻松地做到这一点?

提前致谢!

-Stefan

3 个答案:

答案 0 :(得分:2)

在LEFT JOIN投票表达式中使用子查询,指定您在此范围内作为WHERE子句查找的条件。然后,如有必要,通过转换子查询来优化性能。

答案 1 :(得分:1)

LEFT JOIN (SELECT * FROM votes WHERE DATE(datetime) = DATE(NOW())) votes

我怀疑这不会给你你想要的东西,因为SELECT ... votes.datetime ...会导致每个帖子被多次列出,COUNT(votes.post_id)几乎总是评估为1。

不幸的是,我无法从你的问题中找到你需要的东西。 (“...在同一天的1小时到另一个小时之间”是什么意思?另外,你不能通过投票来订购。)如果你只想要对所有帖子计算今天的投票数,你可以这样做: / p>

SELECT posts.id,
       (SELECT COUNT(*)
          FROM votes
         WHERE DATE(datetime) = DATE(NOW())
           AND post_id = posts.id
       ) AS num_votes
FROM posts

答案 2 :(得分:1)

我不确定我是否正确理解您的问题,但我理解它的方式我建议使用LEFT OUTER JOIN代替LEFT JOIN

通过这种方式,您可以获得所有帖子,即使是没有投票的帖子。

SELECT post.*, votes.datetime, COUNT(votes.post_id) AS votes        
FROM posts LEFT OUTER JOIN votes          
ON posts.id = votes.post_id         
WHERE DATE(votes.datetime) = DATE(NOW())
GROUP BY posts.id       
ORDER BY votes DESC