簡體   English   中英

如何組合這些MySQL查詢,然后正確訪問數據

[英]How to combine these MySQL queries and then access the data correctly

我正在我的應用程序中構建一個嵌套的評論回復系統。

一切當前按預期工作,但我發現自己必須使用幾個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(我希望這樣做以便有一個“查看所有回復”按鈕,然后如果用戶需要,則查詢數據庫以獲得其余的),第二個查詢計數回復總數。

然后還使用上面循環中的第二個嵌套foreach(在這里生成html代碼)為循環內的每個回復生成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個小時與此斗爭,真的需要幫助。

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

如果您希望將注釋和回復保存在兩個不同的表中(請參閱crafter的注釋),您可以通過一個簡單的技巧刪除循環:從第一個查詢中收集注釋ID並使用

在哪里(cid IN(1,2,3,4,...))

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

BurninLeo

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM