我正在我的應用程序中構建一個嵌套的評論回覆系統。如何結合這些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小時,真正需要的幫助。
非常感謝任何人誰提供的任何建議。
也許只是將示例數據和生成的表格添加到表格中,您應該已經更有用了。 – 2012-02-29 17:12:48
很可能是Mosty,指出。如果我沒有那麼匆忙,因爲我從10分鐘開始就有2小時的車程,所以我會按照你的建議編輯問題。 – gordyr 2012-02-29 17:15:34
這已經覆蓋了幾次,包括這篇文章:http://stackoverflow.com/questions/317322/optimized-sql-for-tree-structures – crafter 2012-02-29 18:08:00