我正在尝试与一个帖子列表的页面,并在每个帖子下属于该帖子的所有评论。最初,我只想使用一个查询来使用SQL的JOIN检索所有的post +评论,但是我发现不可能检索一个包含多个评论的post。它只显示每个帖子最多1条评论的帖子,或者根据评论量多次显示一篇帖子。
在这个相关的问题中,有人谈到了使用两个查询:How to print posts and comments with only one sql query
但是我该怎么做呢?
我已经为posts执行了查询和while循环,但是我显然不想在该循环中为每个post运行一个评论查询。
$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, username, reply_content, timestamp)发布于 2012-11-28 00:16:54
您可以在单个查询中完成此操作,如果原始帖子中的数据量为small,则可以执行此操作
$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子句,依此类推。第二种方法的优点是,你不需要为每条评论重新传输原始的帖子数据!
发布于 2012-11-28 00:00:51
为了也能获得那些没有评论的帖子,你需要使用LEFT OUTER JOIN。在这种情况下,第一个表中任何没有第二个表中任何相应行的行都将与一个由空值组成的行配对。
SELECT * FROM posts
LEFT OUTER JOIN comments ON posts~post_id = comments~post_id;顺便说一下:还有一个RIGHT OUTER JOIN。当你使用它时,你会得到所有的评论,包括那些父帖子不知何故丢失了的评论,但没有没有评论的帖子。
https://stackoverflow.com/questions/13587910
复制相似问题