2012-02-29 138 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