SELECT p.*,
u.user_id,
u.user_name,
count(c.comment_post_id) AS comments,
c.comment_added
FROM posts as p
LEFT JOIN comments as c
ON (p.post_id=c.comment_post_id)
LEFT JOIN users as u
ON (p.postedby_id = u.user_id)
GROUP BY p.post_id
HAVING c.comment_added > NOW() - INTERVAL 1 HOUR
ORDER BY comments DESC
我不是很擅长mysql,但经过一番研究后我设法写了这个。
这里应该发生的是一个帖子列表,按最后一小时内评论最多的顺序排列。我的noobscript应该能够解释数据库结构的重要部分。一些SELECTed项目用于PHP目的。
我的剧本出了什么问题?
答案 0 :(得分:0)
代码将无法运行,因为您有GROUP BY
和HAVING
,但SELECT
中的列数多于GROUP BY
中的列数(您应该两个地方都有相同的非聚合列(即Sum,Min,Max,Count,Avg等中未使用的列)。
此外,您不能(也不应该)在SELECT
中使用P. *。我添加了几个虚拟列名称(您应该用实际列名替换)。
最后,如果您希望计算评论数量,那么您的c.comment_added
不应该有SELECT
时间戳。
下面的SQL将为您提供按照他们的评论数量排序的最后一小时内的所有帖子
SELECT p.COL1, P.COl2, u.user_id, u.user_name, count(c.comment_post_id) AS comments
FROM posts as p
LEFT JOIN comments as c
ON (p.post_id=c.comment_post_id)
LEFT JOIN users as u
ON (p.postedby_id = u.user_id)
Where c.comment_added > NOW() - INTERVAL 1 HOUR
Group By p.COL1, P.COl2, u.user_id, u.user_name
Order By count(c.comment_post_id) Desc
答案 1 :(得分:0)
由于您的帖子 - >评论是1:多关系,因此您的结果集中不能包含来自comments
的字段,并希望按posts
进行分组。移除c.comment_added
,我认为您会得到您期望的结果。
此外,将您的HAVING
内容移至WHERE
条款中。 HAVING
是在汇总后确定的,但由于上述原因,您不希望comments_added
出现在您的汇总中。更准确地说,您希望在聚合之前过滤comments
表,这是WHERE
将要执行的操作。
SELECT p.*,
u.user_id,
u.user_name,
count(c.comment_post_id) AS comments
FROM posts AS p
LEFT JOIN comments AS c
ON (p.post_id = c.comment_post_id)
LEFT JOIN users AS u
ON (p.postedby_id = u.user_id)
WHERE c.comment_added > NOW() - INTERVAL 1 HOUR
GROUP BY p.post_id
ORDER BY count(c.comment_post_id) DESC