如何显示每篇文章的所有评论(PHP和SQL)?

时间:2011-09-09 16:00:25

标签: php mysql sql database mysqli

所以我有两个表,文章和评论(有一对多的关系(1篇文章 - 许多评论))。这就是表的结构:

文章 - id(prikey),title,publicationDate,content

评论 - 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 个答案:

答案 0 :(得分:2)

另一种方法是将查询拆分为两个。

第一个会带回你想要的文章......

SELECT * FROM article;

获得后,您可以获取所有ID并使用以下内容

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

这会将MySQL查询限制为2,同时获取所需的所有数据。在循环文章数据之后,在该循环中,循环注释数据。

这也意味着,与使用GROUP_CONCAT不同,您还可以使用作者数据。

这不是一个非常有说服力的解决方案,但应该有效。

答案 1 :(得分:1)

使用类似

的内容
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_pa​​cket的。在运行时更改group_concat_max_len值的语法如下,其中val是无符号整数:

SET [GLOBAL | SESSION] group_concat_max_len = val;

请在此处查看如何更改max_allowed_pa​​cket
http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_allowed_packet

答案 2 :(得分:1)

查询:

    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
} ?>

答案 3 :(得分:0)

查看MySQL GROUP_CONCAT,它将返回以逗号分隔的项目列表。然后,您可以将其分解为评论部分。

答案 4 :(得分:-1)

一旦有人评论文章插入文章ID与该评论,然后相应地得到这样的东西

一旦一个人选择一篇文章来阅读$ _GET中的文章内容,你就可以阅读文章内容了。一旦有人对该文章发表评论,请将其插入如下

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

以及稍后当你拉动它们的方式与$_GET中的文章ID相同 你可以访问它运行像这样的查询

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

希望这会起作用