我确信这很简单......现在就累了。
我有一个查询
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
答案 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