php – 如何使用2个SQL查询检索包含所有注释的所有帖子
发布时间:2020-12-13 17:22:11 所属栏目:PHP教程 来源:网络整理
导读:我正在尝试创建一个包含帖子列表的页面,并在每个帖子下面发布属于该帖子的所有评论.最初我想使用一个查询来使用SQL的JOIN检索所有帖子注释,但我发现无法检索具有多个注释的帖子.它仅显示每个帖子最多为1条评论的帖子,或者只是根据评论的数量多次显示帖子. 在
我正在尝试创建一个包含帖子列表的页面,并在每个帖子下面发布属于该帖子的所有评论.最初我想使用一个查询来使用SQL的JOIN检索所有帖子注释,但我发现无法检索具有多个注释的帖子.它仅显示每个帖子最多为1条评论的帖子,或者只是根据评论的数量多次显示帖子.
在这个相关问题中,有人谈到使用2个查询: 但是我该怎么做? 我有帖子的查询和while循环,但我显然不想为该循环中的每个帖子运行查询. $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)) { ... } 表结构(回复是用于存储注释的表): POST (post_id (primary key),user_id,username,content,timestamp) REPLY (reply_id (primary key),post_id,reply_content,timestamp) 解决方法
您可以在单个查询中执行此操作,如果原始帖子中的数据量很小,则可以:
$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'] ); } 否则,将其分成两个查询,如下所示: $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子句乱丢您的第一个查询,等等.第二种方法的优点是您不会为每条评论重新传输原始帖子数据! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |