Как отобразить все комментарии к статье (PHP и SQL)? - PullRequest
3 голосов
/ 09 сентября 2011

Итак, у меня есть две таблицы, статья и комментарии (которые имеют отношение один-ко-многим (1 статья - много комментариев)). Вот как устроена таблица:

Статьи - id (prikey), заголовок, публикация, дата, содержание

Комментарии - com_id (prikey), автор, комментарий, id (внешний ключ)

Я использовал это для запроса двух таблиц:

SELECT * FROM articles as a INNER JOIN comments as c ON a.id = c.id

Раньше я только отображал таблицу статей, используя это:

<?php 
while($row = mysqli_fetch_array($query)) {

echo "
<div id='article'> 
<header>
    <hgroup>
         <h2>".$row['title']."</h2>
         <h4>Posted on ".$row['publicationDate']."</h4>
    </hgroup>
</header><p>".$row['content']."</p></div>";
}
?>

Здесь отображаются все статьи (с указанием даты, заголовка, содержания и т. Д.). Теперь есть комментарии. Как мне отредактировать php-код (или, если мой запрос неправильный, как написать запрос), чтобы он отображал все статьи и все комментарии по статье, как в:

Article One
 -- Comment 1
 -- Comment 2, etc.

Article Two
 -- Comment 1
 -- Comment 2, etc.

Ответы [ 5 ]

2 голосов
/ 09 сентября 2011

Альтернативой может быть разделение запроса на две части.

Первый вернет вам статьи, которые вы хотите ...

SELECT * FROM article;

Получив их, вы можете получить все идентификаторы и использовать что-то вроде следующего

SELECT * FROM comments WHERE article_id IN (".$list.");

Это ограничивает запросы MySQL 2, получая все необходимые данные. После этого цикла вокруг данных статьи и в этом цикле вокруг данных комментариев.

Это также означает, что, в отличие от использования GROUP_CONCAT, у вас также будут данные об авторах для использования.

Это не очень красноречивое решение, но должно работать.

1 голос
/ 09 сентября 2011

Запрос:

    SELECT c.author, c.comment, 
           a.id article_id, a.title, a.publicationDate, a.content
      FROM comments c
RIGHT JOIN articles a
        ON c.id = a.id

PHP:

<?php
$lastArticleId  = 0;
$isNewArticle   = false;
while($row = mysqli_fetch_array($query)) {
    $isNewArticle = ($lastArticleId != $row['article_id']) ? true : false;
    if($isNewArticle) {
        $lastArticleId = $row['article_id']; ?>
        <div class="article">
            <header>
                <hgroup>
                    <h2><?php echo $row['title']; ?></h2>
                    <h4>Posted on <?php echo $row['publicationDate']; ?></h4>
                </hgroup>
            </header>
            <p><?php echo $row['content']; ?></p>
        </div>
<?php
    }
    if($row['comment'] != '') { ?>
        <p><strong><?php echo $row['author']; ?></strong> - <?php echo $row['comment']; ?></p>
<?php
    } ?>
<?php
} ?>
1 голос
/ 09 сентября 2011

Используйте что-то вроде

SELECT a.article
       ,GROUP_CONCAT(CONCAT('<p>', c.comment, '</p>') SEPARATOR "\n") as comments
FROM
article a
INNER JOIN comment c ON (c.article_id = a.id)
WHERE a.id = '12454';

Возможно, вам придется немного поиграться с разделителем.

См .: http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

Обратите внимание:

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

SET [GLOBAL | SESSION] group_concat_max_len = val;

Смотрите здесь, как изменить max_allowed_packet
http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_allowed_packet

0 голосов
/ 09 сентября 2011

как только человек прокомментирует статью, вставьте идентификатор статьи с этим комментарием, а затем получите, соответственно, что-то вроде этого

как только человек выберет статью для чтения, отправьте идентификатор статьи в $ _GET на свою страницу статьи, чтобы вы могли перевыполнить идентификатор статьи. Как только человек прокомментирует эту статью, вставьте ее следующим образом

$sql = mysql_query("INSERT INTO comments_table (subject,article_id,comments) VALUES ('$subject','$_GET['id']','$comments')");

и позже, когда вы тянете их, делайте это так же, как у вас есть идентификатор статьи в $_GET вы можете получить к нему доступ, запустив такой запрос

$fetch = mysql_query("SELECT * FROM comments WHERE article_id = $_GET['id'] ORDER BY id DESC") or die(mysql_error());

Надеюсь, это сработает

0 голосов
/ 09 сентября 2011

Просмотрите MySQL GROUP_CONCAT, который вернет список элементов, разделенных запятыми.Затем вы можете разобрать это в разделе комментариев.

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