2011-09-09 101 views
3

所以我有兩個表格,文章和評論(它有一對多的關係(1篇文章 - 很多評論))。這是表是如何構成的:如何顯示每篇文章的所有評論(PHP和SQL)?

文章 - ID(prikey),標題,publicationDate,內容

評論 - 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. 
+0

我們什麼都不知道你的意見表模式,我們怎麼能建議什麼? – Shef

回答

2

另一種方法是分裂查詢成兩個。

首先將帶回你想要的物品......

SELECT * FROM article; 

一旦你擁有了這些,你可以得到所有的ID,並使用類似以下

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

這限制了MySQL查詢到2,同時獲得所有你需要的數據。在圍繞文章數據循環之後,在該循環中循環評論數據。

這也意味着,與使用GROUP_CONCAT不同,您還將使用作者數據。

這不是一個非常雄辯的解決方案,但應該工作。

+0

我現在使用這個解決方案,因爲我仍然在學習基礎知識。但爲什麼它不是一個雄辯的解決方案?有兩個查詢(一個在另一個裏面)是不可取的? – catandmouse

0

查找到MySQL GROUP_CONCAT將返回用逗號分隔的項目列表。然後,您可以爲您的評論部分進行分解。

-1

一旦一個人會在文章插入文章編號與該評論發表評論,後來讓他們因此像這樣

一旦一個人會選擇一篇文章來讀取$ _GET發送文章編號,以你的文章頁面這樣你就可以將多餘的物品id.Once一個人將上發表評論文章插入如下

$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

哦,您好,歡迎來到SO [Bobby Tables](http://xkcd.com/327/)。 – Shef

+0

@Shef,我低估了雅,所以你不必 – Johan

+0

@亨利,請閱讀這個問題,它的答案,並永遠不會發布這樣的代碼:http://stackoverflow.com/questions/332365/xkcd-sql -injection-please-explain這會讓你的php應用程序pwnd。 – Johan

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

待辦事項但是:

的結果被截斷,其具有1024的默認值的值可以是由所述group_concat_max_len系統變量給定的最大長度,設置得更高,但返回值的有效最大長度受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

+1

您可以更改'GROUP_CONCAT(CONCAT('

',c.comment,'

')SEPARATOR「\ n」)' – ajreal

+0

@ajreal,謝謝,這是個好主意。 – Johan

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 
} ?> 
相關問題