簡體   English   中英

如何合並這些循環的MySQL查詢?

[英]How can I combine these looped MySQL queries?

我最近開始對某個應用程序發表評論/回復部分。
我最初的方法是查詢數據庫,以獲取鏈接到特定項目的評論,如下所示:

$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";  

然后,我使用以下查詢開始了一個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"; 
  }
}

在實踐中,這一切都很好,但是令我驚訝的是,這效率極低,並且必須有一種方法可以在一個查詢中檢索所有數據。 我擔心的是,在頁面上有100條評論時,我將僅對評論執行100條查詢。

解決此問題的最佳方法是什么,我將如何組合這些查詢以生成一個大對象/數組以從中提取數據。

或者,如何至少防止“環內查詢”。

我傾向於避免這種設置的方法是:

SELECT ...
WHERE `keyfield` IN (".implode(",",$keyvalues).")
SELECT c.*, 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 projects_comments AS c
  LEFT JOIN users        AS cu ON cu.ID = c.userid
  JOIN project_replies   AS r  ON r.cid = c.commentid 
  LEFT JOIN users        AS ru ON ru.ID = r.uid
 WHERE c.projectid = $projectid
 ORDER BY c.commentid DESC, r.id DESC

連接Project_Replies和Project_Comments時,唯一需要擔心的細節是JOIN而不是可能使用LEFT JOIN。 這只會挑選至少有一個回復的評論; 使用LEFT JOIN,您還會收到沒有回復的評論。

您可以像執行users表一樣JOIN他們

    $commentquery = "SELECT projects_comments.*, project_replies.*, users.user_url, users.display_name, users2.user_url as comment_user_url, users2.display_name as comment_display_name
                     from ".$wpdb->prefix."projects_comments projects_comments
                LEFT JOIN ".$wpdb->prefix."project_replies project_replies ON project_replies.cid = projects_comments.comment_id
                LEFT JOIN ".$wpdb->prefix."users users on users.ID=project_replies.uid
                left join ".$wpdb->prefix."users users2 on users2.ID=projects_comments.userid
                    WHERE projectid = '$projectid'  
                 ORDER BY projects_comments.commentid desc, project_replies.id DESC";   

暫無
暫無

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

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