2012-02-29 41 views
6

我正在我的應用程序中構建一個嵌套的評論回覆系統。如何結合這些MySQL查詢,然後正確訪問數據

目前一切正常,但我發現自己必須使用多個MySQL查詢才能檢索所需的數據。更糟糕的是,對'回覆'的查詢在foreach循環中。這意味着儘管目前它的表現令人欽佩,但它遠非最佳,並且會隨着數據集的增長而出現問題。

因此,我希望在深入研究之前解決這個問題。

由於該應用程序的表格與該網站的wordpress博客共享相同,因此我正在使用wordpress簡寫查詢。

生成的頁中的電流的方法是如下:

甲註釋查詢表以及與一個專案編號所有結果檢索到: -

$commentquery = "select projects_comments.*, users.user_url, users.display_name 
       from ".$wpdb->prefix."projects_comments projects_comments 
       left join ".$wpdb->prefix."users users on users.ID=projects_comments.userid 
       where projectid = '$projectid' 
       order by projects_comments.commentid desc 
       "; 

$comments = $wpdb->get_results($commentquery); 

我然後如下進行foreach循環: -

if($comments) { 
      foreach ($comments as $c) 
       { 


       $replyquery = "select project_replies.*, users.user_url, users.display_name 

       from ".$wpdb->prefix."project_replies project_replies 
       left join ".$wpdb->prefix."users users on users.ID=project_replies.uid 
       where project_replies.cid = '$c->commentid' 
       order by project_replies.id desc   
       limit 2   
       ";  

       $replies = $wpdb->get_results($replyquery); 

       asort($replies); 

       $countquery = "select count(*) 

        from ".$wpdb->prefix."project_replies project_replies 
        where project_replies.cid='".$c->commentid."' 
        "; 

       $replycount = $wpdb->get_var($countquery); 

    //generate html here 
    } 
} 

在此循環內部還有兩個查詢。第一個獲得每個評論的回覆,但將結果限制爲2(我希望這樣做是爲了有一個「查看所有回覆」按鈕,然後如果用戶要求他們查詢數據庫的其餘部分),第二個查詢計數回覆的總數。

在HTML然後也使用上述迴路內的第二嵌套的foreach(在那裏說生成這裏HTML代碼)的環內每個回覆產生如下: -

if ($replies){ 

    foreach ($replies as $r){ 

    // generate each reply 
    } 
} 

所有數據被從拉這些陣列以下列方式:

$c->userid, $c->body etc... For the comments 
$r->userid, $r->body etc... For the replies. 

我希望保持這種格式,如果可能的話。

正如在問題開始時所述,這一切都很好,但我知道,通過嵌套答覆和計數查詢,我執行的查詢超過了必要的數量。 100條評論將產生100條回覆查詢和100條回覆查詢等。

感謝本網站上的一些有幫助的人,我曾考慮過使用聯接來一次性獲取所有原始數據以進行評論和回覆。是這樣的...

$commentquery2 = "SELECT c.commentid, c.userid, c.body as cbody, c.projectid, c.posttime, cu.user_url AS cu_url, cu.display_name AS cu_name, 
        r.*, ru.user_url AS ru_url, ru.display_name AS ru_name 
       FROM ".$wpdb->prefix."projects_comments AS c 
       LEFT JOIN ".$wpdb->prefix."users  AS cu ON cu.ID = c.userid 
       LEFT JOIN ".$wpdb->prefix."project_replies AS r ON r.cid = c.commentid 
       LEFT JOIN ".$wpdb->prefix."users  AS ru ON ru.ID = r.uid 
       WHERE c.projectid = $projectid 
       ORDER BY c.commentid DESC, r.id DESC"; 

雖然這確實工作(並且是足以讓我以紀念這個問題作爲回答)時,把它付諸實踐我有一些困難。

首先,這將檢索所有數據作爲單獨的行,這意味着如果我有5條評論,每條評論有3條回覆,我實際上得到15條返回的行,而不是嵌套數據對象,並且回覆嵌套在每條評論行中。

爲了解決這個我已經嘗試了一些陣列操作,如下所示:

$old_id=NULL; 
$comments=array(); 

foreach($getcomments as $c){ 

    if($c->commentid !== $old_id){ 

     $comments[$old_id] = $c; 
     $old_id = $c->commentid; 

    } 


    $comments[$old_id]['replies'][] = $c; 


} 

這樣做給我一個嵌套的數據對象作爲必需的。但是,它不包括回覆計數查詢,並且它不會按照預期將每個回覆集合限制爲2,它將檢索所有回覆。

最後用foreach循環中我當前的HTML生成代碼:

foreach($comments){ 

    //generate comment html 

    foreach($replies) { 

     //generate replies html 

    } 

} 

我似乎無法得到它與嵌套數據對象的正常工作。訪問正確的深度答覆似乎讓我感到困惑。所以總而言之,我希望能夠移除循環查詢,將它們組合成一個更大且更高效的查詢,或者最糟糕的情況下將它們組合成一個數據查詢和一個單獨的計數查詢,然後創建一個整齊的嵌套數據對象,與行評論和任何回覆嵌套在標題'回覆'下

然後,我需要能夠通過這些在我的PHP代碼中正確地迭代,以便生成所需的HTML。

我對這個問題的長度道歉,並意識到它很可能把很多人都回答過,但我一直在這條直線現在作戰19小時,真正需要的幫助。

非常感謝任何人誰提供的任何建議。

+0

也許只是將示例數據和生成的表格添加到表格中,您應該已經更有用了。 – 2012-02-29 17:12:48

+0

很可能是Mosty,指出。如果我沒有那麼匆忙,因爲我從10分鐘開始就有2小時的車程,所以我會按照你的建議編輯問題。 – gordyr 2012-02-29 17:15:34

+0

這已經覆蓋了幾次,包括這篇文章:http://stackoverflow.com/questions/317322/optimized-sql-for-tree-structures – crafter 2012-02-29 18:08:00

回答

2

如果您想保留留言和回覆在兩個不同的表(見工匠的評論),你可以用一個簡單的一招消除環路:收集來自第一查詢註釋ID和使用

WHERE( CID IN(1,2,3,4,...))

,而不是循環。如果您需要限制每條評論的回覆,那麼應該可以使用額外的WHERE-或HAVING子句。

BurninLeo

+0

感謝BurninLeo。雖然這讓我開始了很長的路要走,但我想讓問題稍微長一些,希望能夠獲得更多的答覆/解決方案。我希望你明白。 – gordyr 2012-03-01 17:26:25

+0

我甚至不確定這是否真的是你需要的;)我也對其他意見感興趣。只要我找到一些時間,我也會閱讀鏈接在你的問題的評論鏈接的線程中的嵌套集的介紹... – BurninLeo 2012-03-02 08:04:50