php - 如何组合这些循环的 MySQL 查询?

标签 php 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 次查询。

解决此问题的最佳方法是什么?我将如何组合这些查询以生成一个大型对象/数组,以从中提取数据。

或者,我怎样才能至少防止“循环内查询”。

最佳答案

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/

相关文章:

mysql - 如何查询酒店数据库以返回对连续三晚可用的单间的查询?

php - jQuery 模态表单提交

php - 如何消除PHP中的反斜杠

php - 想要使用 Doctrine 在 sub SELECT 上运行 COUNT

php - 如何在 laravel 中更新组合框?

java - 打开传出端口 (CENTOS)

php - 如何转换这些奇怪的字符? (ë, Ã, ì, ù, Ã)

php - 如何使用 jscript 删除菜单中 span 标签的最后一个元素?

php - 无法使用 php 在数据库中插入带有 ' 符号的文本

mysql - 具有 MySql 并发 token 的 Entity Framework 6 不起作用