【问题标题】:How to display all comments per article (PHP & SQL)?如何显示每篇文章的所有评论(PHP 和 SQL)?
【发布时间】:2011-09-09 16:00:25
【问题描述】:

所以我有两个表,article 和 cmets(具有一对多关系(1 article - many cmets))。这就是表格的结构:

文章 - 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>";
}
?>

这会显示所有文章(包括日期、标题、内容等)。现在有cmets。如何编辑 php 代码(或者如果我的查询不正确,如何编写查询),以便它显示所有文章和每篇文章的所有 cmets,如下所示:

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

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

【问题讨论】:

  • 我们对您的 cmets 表架构一无所知,我们如何提出建议?

标签: php mysql sql database mysqli


【解决方案1】:

另一种方法是将查询分成两部分。

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

SELECT * FROM article;

一旦你有了这些,你就可以得到所有的 ID 并使用类似下面的东西

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

这将 MySQL 查询限制为 2,同时获取您需要的所有数据。在围绕文章数据循环之后,在该循环中,围绕 cmets 数据循环。

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

这不是一个很有说服力的解决方案,但应该可以。

【讨论】:

  • 我现在使用这个解决方案,因为我还在学习基础知识。但为什么它不是一个雄辩的解决方案?是否建议有两个查询(一个在另一个内部循环)?
【解决方案2】:

查询:

    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】:

    使用类似的东西

    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。该值可以设置得更高,尽管返回值的有效最大长度受值的限制最大允许数据包。运行时改变 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

    【讨论】:

    • 你可以改GROUP_CONCAT(CONCAT('&lt;p&gt;', c.comment, '&lt;/p&gt;') SEPARATOR "\n")
    【解决方案4】:

    查看 MySQL GROUP_CONCAT,它将返回一个逗号分隔的项目列表。然后你可以为你的 cmets 部分分解它。

    【讨论】:

      【解决方案5】:

      一旦有人对一篇文章发表评论,请插入带有该评论的文章 ID,然后相应地获得类似这样的内容

      一旦有人选择要阅读的文章,请将 $_GET 中的文章 ID 发送到您的文章页面,以便您可以超出文章 ID。一旦有人对该文章发表评论,请按如下方式插入

      $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());
      

      希望这会奏效

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      • 1970-01-01
      • 2021-08-04
      • 2016-03-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-09
      相关资源
      最近更新 更多