Как распечатать сообщения и комментарии только с одним SQL-запросом - PullRequest
1 голос
/ 12 января 2010

Можно ли распечатать (PHP) все мои сообщения в блоге + связанные комментарии через один SQL-запрос?

Если да, то как?

Я думал в этом направлении:

SELECT p.post_id, p.title, c.comment_body
FROM posts p
LEFT JOIN comments c
ON c.parent_id = p.post_id

Но это не сработало, как я ожидал

Ответы [ 6 ]

4 голосов
/ 12 января 2010

Использование одного запроса SQL не очень удобно, так как у вас есть 1 пост и несколько комментариев.
Добавление сведений о записи к каждому комментарию (в комбинированном запросе) является пустой тратой ресурсов.

Гораздо удобнее получить детали сообщения и использовать post_id сообщения, чтобы найти комментарии, относящиеся к сообщению.

1 голос
/ 12 января 2010

Если вы используете MySQL, вы можете использовать функцию GROUP_CONCAT :

SELECT p.post_id, p.title, GROUP_CONCAT(c.comment_body)
FROM posts
LEFT JOIN comments c ON c.parent_id = p.post_id
GROUP BY p.post_id
0 голосов
/ 12 января 2010

«Но это не сработало, как я ожидал»

... но вы не говорите, что ожидали.

Если предположить, что подразумеваемая схема в вашем запросе верна, то ежу понятно, что сообщения будут показаны только один раз:

$lastpostid=false;
while ($r=mysql_fetch_assoc($result)) {
  if ($r['post_id']!=$lastpost) {
     print "Post: " . $r['title'] . "<br />\n";
     $comment_id=1;
     $lastpost=$r['post_id'];
  }
  print "Comment # $comment_id : " . $r['comment_body'] . "<br />\n";
  $comment_id++;
}

Но, как я уже сказал, это означает, что ваш запрос правильный (т. Е. Комментарии не являются иерархическими). ​​

С * * +1010

0 голосов
/ 12 января 2010

Для MySQL:

SELECT p.post_id, p.title, GROUP_CONCAT(c.comment_body), count(*) as coment_cnt
FROM
    posts p
        LEFT JOIN comments c ON (p.post_id = c.parent_id)
GROUP BY
    p.post_id
0 голосов
/ 12 января 2010

При получении данных просто используйте имя поля, например: $ result = mysql_query ("ВЫБЕРИТЕ p.post_id, p.title, c.comment_body из сообщений p СЛЕДУЮЩИЕ КОММЕНТАРИИ ОБЪЕДИНЕНИЯ c ON c.parent_id = p.post_id");

while($row = mysql_fetch_array($result))
  {
  echo $row['title'] . " " . $row['comment_body'];
  echo "<br />";
  }

От: http://www.tizag.com/mysqlTutorial/mysqljoins.php

0 голосов
/ 12 января 2010

Самый простой способ, который я могу придумать, - это перебрать все возвращенные строки и сгруппировать их в ассоциативный массив, где ключами являются идентификаторы записей. Затем вы можете выполнить итерацию по этому ассоциативному массиву и распечатать комментарии для каждого сообщения, взяв заголовок сообщения из первой строки в группе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...