2015-04-16 50 views
0
SELECT p.*, u.user_id, u.user_name, 
     COUNT(c.comment_id) AS count, 
     COUNT(v.vote_post_id)/
     (TIMESTAMPDIFF(MINUTE, v.vote_timestamp, SYSDATE()) + 1) AS rate 
FROM posts AS p 
LEFT JOIN comments AS c ON (p.post_id = c.comment_post_id) 
LEFT JOIN post_votes AS v ON (p.post_id = v.vote_post_id) 
LEFT JOIN users AS u ON (p.postedby_id = u.user_id) 
GROUP BY p.post_id 
ORDER BY COUNT(v.vote_post_id)/
    (TIMESTAMPDIFF(MINUTE, v.vote_timestamp, SYSDATE()) + 1) DESC 

这是我正在处理的脚本。我的db没有很好地进行测试,但前两项结果的评论数量翻了一番。你能在这里看到任何明显的错误吗?我有一个在这里很好的作品脚本的另一个版本:sql脚本中的奇怪错误

SELECT p.*, u.user_id, u.user_name, 
     COUNT(c.comment_id) AS count 
    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 
    ORDER BY COUNT(c.comment_post_id)/
     (TIMESTAMPDIFF(MINUTE, p.post_timestamp, SYSDATE()) + 1) DESC 
+5

哪个dbms? (非ANSI SQL,如涉及TIMESTAMPDIFF ...) – jarlh

+2

什么是你想要的确切输出和你指定的内容 –

+1

它可能与第一个查询中的额外连接有关 –

回答

1

多张选票会导致您的评论重复。如果您想在post_votes表上执行子选择,则可以将每个帖子的总投票数作为单个值获得,如果您GROUP BYvote_post_id

由于COUNT是保留字,因此我不建议将它用作结果集中的列名称。

如果你只是收到评论数,而不是评论本身,那么你也会希望在一个子选择中,或者你会在帖子上加倍。

SELECT p.*, u.user_id, u.user_name, c.comment_count, 
    v.vote_count AS total_votes, 
    v.vote_count/(TIMESTAMPDIFF(MINUTE, p.post_timestamp, SYSDATE()) + 1) as votes_per_minute 
FROM posts AS p 
LEFT JOIN (SELECT comment_post_id, COUNT(comment_post_id) AS comment_count FROM comments GROUP BY comment_post_id) AS c ON (p.post_id = c.comment_post_id) 
LEFT JOIN (SELECT vote_post_id, COUNT(vote_post_id) AS vote_count FROM post_votes GROUP BY vote_post_id) AS v ON (p.post_id = v.vote_post_id) 
LEFT JOIN users AS u ON (p.postedby_id = u.user_id) GROUP BY p.post_id 
ORDER BY v.vote_count/(TIMESTAMPDIFF(MINUTE, p.post_timestamp, SYSDATE()) + 1) DESC 
+0

当我尝试运行这个查询时,我得到了“#1054 - 'order clause'中的未知列'v.vote_timestamp'”。你能帮助吗? – user3127399

+0

哦,是的 - 你想按照时间戳排序,而且我没有把它作为子选择的一部分。我不完全确定你想用这种计算来完成什么 - 它是每天投票吗?如果是这样,那么这个计算就需要成为子选择的一部分,然后你可以在外部'SELECT'中返回它,并且也可以通过它进行排序。 – Danny

+0

它应该是所有帖子的列表,按其创建后每分钟拥有最多票数的顺序排列。但我需要获得与帖子相关的所有评论的数量,以用于PHP目的。我并不擅长这个东西,而且它变得非常复杂。 – user3127399

0

显然你正在使用MySQL becasue它是允许这种类型的组由唯一的数据库。然而,100%的时间使用它是一个不好的选择。您应该按照所有其他数据库要求的方式,将select中不属于聚合函数的所有字段进行分组。这是一个需要工作的团队。这可能会清除你的问题。它可能不依赖于数据。如果您在某些连接表中有多个记录,并且它们在某些字段中恰好有不同的数据,那么在正确分组时您仍可能不会获得一条记录。在这种情况下,您需要为连接编写派生表,或者在具有多个值的字段上使用聚合来告诉数据库使用哪个值。

+0

是啊......我对mysql并不是很了解,现在我的头脑还在。你可能是对的,我将不得不阅读更多关于连接和分组。谢谢您的帮助! – user3127399