0

你知道 Facebook 主页是如何列出所有最近的帖子的吗?它显示发布的用户、他们的实际帖子以及附加到该帖子的前几条评论。这就是我想要实现的目标,但我很难构建一个可以收集所有数据的查询。

我有 3 个表:用途、帖子和评论。每个都有一个唯一的 ID,但它们引用彼此的 ID。即,Comments 表具有发布用户的 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

        ";

但是,与其查找帖子有多少评论,我更愿意阅读前几篇帖子。谁能想到只用一个查询来实现这一目标的方法?

4

1 回答 1

0

您可以将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.

希望这可以帮助!

于 2013-05-06T15:22:59.640 回答