首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用2个SQL查询检索包含所有评论的所有帖子

问如何使用2个SQL查询检索包含所有评论的所有帖子
EN

Stack Overflow用户
提问于 2012-11-27 23:49:09
回答 2查看 2.3K关注 0票数 4

我正在尝试与一个帖子列表的页面,并在每个帖子下属于该帖子的所有评论。最初,我只想使用一个查询来使用SQL的JOIN检索所有的post +评论,但是我发现不可能检索一个包含多个评论的post。它只显示每个帖子最多1条评论的帖子,或者根据评论量多次显示一篇帖子。

在这个相关的问题中,有人谈到了使用两个查询:How to print posts and comments with only one sql query

但是我该怎么做呢?

我已经为posts执行了查询和while循环,但是我显然不想在该循环中为每个post运行一个评论查询。

代码语言:javascript
复制
$getPost = mysql_query('SELECT p.post_id,
                               p.user_id,
                               p.username,
                               p.content
                        FROM post p
                        ORDER BY p.post_id DESC');

while($row = mysql_fetch_array($getPost)) 
{ 
... 
}

表结构(回复为存储评论的表):

代码语言:javascript
复制
POST (post_id (primary key), user_id, username, content, timestamp)
REPLY (reply_id (primary key), post_id, username, reply_content, timestamp)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-28 00:16:54

您可以在单个查询中完成此操作,如果原始帖子中的数据量为small,则可以执行此操作

代码语言:javascript
复制
$getPost = mysql_query('SELECT
  p.*,
  r.reply_id, r.username r_username, r.reply_content, r.timestamp r_timestamp
  FROM post p
    left join reply r
  ORDER BY p.post_id DESC'
);

$posts = array();
$last_id = 0;
while($row = mysql_fetch_array($getPost)) 
{ 
  if ($last_id != $row['post_id']) {
    $posts[] = array(
      'post_id' => $row['post_id'],
      'user_id' => $row['user_id'],
      'username' => $row['username'],
      'content' => $row['content'],
      'timestamp' => $row['timestamp'],
      'comments' => array()
    );
  }

  $posts[sizeof($posts) - 1]['comments'][] = array(
    'reply_id' => $row['reply_id'],
    'username' => $row['r_username'],
    'reply_content' => $row['reply_content'],
    'timestamp' = $row['r_timestamp']
  );
}

否则,将其分解为两个查询,如下所示:

代码语言:javascript
复制
$getPost = mysql_query('SELECT
  p.*,
  FROM post p
  ORDER BY p.post_id DESC'
);

$rows = array();
$ids = array();
$index = array();
while($row = mysql_fetch_assoc($getPost)) {
  $row['comments'] = array();
  $rows[] = $row;
  $ids[] = $row['post_id'];
  $index[$row['post_id']] = sizeof($rows) - 1;
}

$getComments = mysql_query('select r.* from replies r where r.post_id in ("'
  . join('","', $ids)
  . '")');
while ($row = mysq_fetch_assoc($getComments)) {
  $rows[$index[$row['post_id']]]['comments'][] = $row;
}

..。或者类似的东西。任一选项都允许您在第一个查询中随意使用WHERE子句,依此类推。第二种方法的优点是,你不需要为每条评论重新传输原始的帖子数据!

票数 4
EN

Stack Overflow用户

发布于 2012-11-28 00:00:51

为了也能获得那些没有评论的帖子,你需要使用LEFT OUTER JOIN。在这种情况下,第一个表中任何没有第二个表中任何相应行的行都将与一个由空值组成的行配对。

代码语言:javascript
复制
SELECT *  FROM posts
LEFT OUTER JOIN comments ON posts~post_id = comments~post_id;

顺便说一下:还有一个RIGHT OUTER JOIN。当你使用它时,你会得到所有的评论,包括那些父帖子不知何故丢失了的评论,但没有没有评论的帖子。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13587910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档