我最近开始为一个应用程序添加评论/回复部分。
我最初的方法是在数据库中查询链接到特定项目的评论,如下所示:-
$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 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
唯一需要担心的细节是 JOIN 而不是在连接 Project_Replies 和 Project_Comments 时可能使用 LEFT JOIN。这只会收集至少有一个回复的评论;使用 LEFT JOIN,您也会收到没有回复的评论。
关于php - 如何组合这些循环的 MySQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9493341/