2012-02-29 75 views
1

我最近開始評論/回覆部分的應用程序。
我最初的方法是在數據庫中查詢鏈接到特定條目下面的意見: -我怎樣才能結合這些循環MySQL查詢?

$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條查詢。

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

或者,我怎樣才能至少防止'查詢在循環中'。

回答

2
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,你會得到沒有回覆的評論。

+0

謝謝喬納森......雖然提出的其他解決方案也解決了問題,但我發現你最容易理解的問題,同時仍然將所有內容都保存在單個查詢中。非常感謝您的幫助。 – gordyr 2012-02-29 04:42:14

2

我傾向於做,以避免這種設置是這樣的:

SELECT ... 
WHERE `keyfield` IN (".implode(",",$keyvalues).") 
+0

Ahh我明白了......在我的例子中,我將把回答查詢移出循環,並且一旦選擇所有必需的數據並根據其索引訪問它就執行它? – gordyr 2012-02-29 03:59:26

+0

這是正確的。通常我會運行查詢並創建一個數組,然後立即循環查詢結果,如下所示:'while($ r = mysql_fetch_assoc($ sql))$ arr [$ r ['id']] = $ r;' – 2012-02-29 04:02:55

1

您可以JOIN他們像你一樣的users

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

感謝Umbrella,這看起來是一個很好的解決方案,就像Kolink's一樣。你覺得哪種方法比大數據集更快? – gordyr 2012-02-29 04:04:54

+0

傘的解決方案可能比Kolink的更好,雖然我不確定我理解Kolink的解決方案。 – 2012-02-29 04:07:57

+0

我建議測試兩種方法,以查看哪種方法對您的數據效果最好。一般來說,我建議使用'JOIN'來解決這種類型的問題,而不是兩個查詢(一個用於獲取ID,一個用於查詢IN中的IN)。 – Umbrella 2012-02-29 04:11:39