所以我有两个表,文章和评论(有一对多的关系(1篇文章-许多评论))。表的结构是这样的:
文章- id (prikey), title, publicationDate, content
Comments - com_id (prikey), author, comment, 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.
另一种选择是将查询拆分为两个。
第一个会带回来你想要的文章…
SELECT * FROM article;
一旦你有了这些,你可以得到所有的id,并使用下面的东西
SELECT * FROM comments WHERE article_id IN (".$list.");
这将MySQL查询限制为2,同时获得所需的所有数据。在这个循环之后,循环文章数据,在那个循环中,循环评论数据。
这也意味着,与使用GROUP_CONCAT不同,您还可以使用作者数据。
这不是一个非常雄辩的解决方案,但应该有效。
查询:
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
} ?>
使用
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
查看MySQL GROUP_CONCAT,它将返回一个逗号分隔的项目列表。你可以在你的评论区展开。
一旦有人评论了一篇文章,就插入带有该评论的文章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());
希望能成功