两个左连接和最后一小时的记录

时间:2015-04-15 18:38:59

标签: mysql

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目的。

我的剧本出了什么问题?

2 个答案:

答案 0 :(得分:0)

代码将无法运行,因为您有GROUP BYHAVING,但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