检索来自MySQL表格的帖子的前几个评论

问题描述:

你知道Facebook主页如何列出所有最近的帖子?它显示发布的用户,他们的实际发布内容以及该帖子附带的前几个评论。这就是我想要实现的目标,但是我很难建立一个可以收集所有数据的单个查询。检索来自MySQL表格的帖子的前几个评论

我有3个表:用途,帖子和评论。每个人都有一个唯一的ID,但他们引用了彼此的ID。即,注释表具有用于发布的用户的user_id和其附加的帖子的post_id的列。

当时我查询SQL来收集所有帖子。我和我的用户和评论表,了解海报的用户名和一个总的职位有多少评论了,就像这样:

$query = " 

     SELECT  `posts`.`id`,`posts`.`message`,`posts`.`link`, 
        `posts`.`posted`,`posts`.`category`,`posts`.`user_id`, 
        `users`.`username`, 
        count(`comments`.`id`) 
     FROM  `posts` 
     INNER JOIN `users` 
     ON   `posts`.`user_id`=`users`.`id` 
     JOIN  `comments` 
     ON   `comments`.`post_id`=`posts`.`id` 
     WHERE  `posts`.`group_id` = '$id' 
     AND   `posts`.`category`='$filter' 
     GROUP BY `posts`.`id` 
     ORDER BY `posts`.`posted` 
     DESC 

     "; 

但不是找到多少评论的帖子有,我反而喜欢阅读前几个帖子。任何人都可以想出一种方法来实现这一点只有一个查询?

您可以将LIMIT子句用于“第一个”帖子。通过将“第一篇文章”作为子查询,然后加入评论,您可以在单个查询中获得所有内容。在没有评论的帖子的情况下,评论应该是加入的。

注:

  • 这个查询是未经测试,但它应该是接近。

  • 这将得到全部对于前几个帖子的评论,所以你需要使用前端显示代码来限制“每篇帖子最多3条评论”的显示。

  • 在查询中使用变量在每个帖子内限制注释可能是3个,但这不是我知道该怎么做的。

这里的查询:

SELECT 
    FirstPosts.id, 
    FirstPosts.message, 
    FirstPosts.link, 
    FirstPosts.posted, 
    FirstPosts.posts, 
    FirstPosts.user_id, 
    FirstPosts.username, 
    comments.<< your comment column >> 
FROM (
    SELECT  `posts`.`id`,`posts`.`message`,`posts`.`link`, 
       `posts`.`posted`,`posts`.`category`,`posts`.`user_id`, 
       `users`.`username` 
     FROM  `posts` 
     INNER JOIN `users` 
     ON   `posts`.`user_id`=`users`.`id` 
     WHERE  `posts`.`group_id` = '$id' 
     AND   `posts`.`category`='$filter' 
     ORDER BY `posts`.`posted` DESC 
     LIMIT 20) FirstPosts 
    LEFT JOIN comments ON FirstPosts.id = comments.post_id 
ORDER BY FirstPosts.Posted, comments.<< column you use to determing comment order >> 

如果您按日期或序列确定评论顺序,你必须ORDER BY FirstPosts.Posted, comments.whatever DESC

希望这会有所帮助!

+0

感谢您的回复。我实际上使用mysqli。另外,我的问题不是如何限制我的结果,而是如何得到结果。如果在我的页面上会显示20个帖子,我不想运行20个查询来返回评论,我想获取所有帖子数据和这个查询中的前3个评论。我想这意味着如果MySQL能够做到这一点,MySQL会返回一个INSIDE数组。 – user1537360 2013-05-06 15:26:10

+0

对不起,我误解了这个。我会更新我的答案,但请注意:(a)查询未经测试;(b)前20条帖子将获得*全部*评论,因此您必须使用前面 - 结束PHP代码。 – 2013-05-06 15:34:22

+0

哈哈得承认,这打破了我的头脑一段时间(我对MySQL很新颖)。想想我的头脑,但是做了一些调整,并做到了这一点。谢谢! – user1537360 2013-05-06 16:09:10