【问题标题】:How to print posts and comments with only one sql query如何仅使用一个 sql 查询打印帖子和评论
【发布时间】:2010-01-12 14:24:29
【问题描述】:

是否可以通过一个 sql 查询打印出 (PHP) 我所有的博客文章 + 关联的 cmets?

如果有,怎么做?

我在想这个方向:

SELECT p.post_id, p.title, c.comment_body
FROM posts p
LEFT JOIN comments c
ON c.parent_id = p.post_id

但这并没有像我预期的那样成功

【问题讨论】:

  • 为什么没有达到你的预期?
  • 您希望结果如何?
  • 您特别将此标记为 mysql/join 但也许您想尝试mongodb.org/display/DOCS/PHP+Language+CenterMongoDB (from "humongous") is a scalable, high-performance, open source, schema-free, document-oriented database.

标签: php mysql join


【解决方案1】:

使用一个 SQL 查询不是很方便,因为您有 1 个帖子和多个 cmets。
将帖子详细信息添加到每个评论(在组合查询中)是一种资源浪费。

更方便获取帖子详情,使用帖子的post_id查找属于该帖子的cmets。

【讨论】:

  • +1。这种情况需要两个查询——这是帖子与 cmets 的一对多关系。只有当它是一对一的关系时,才建议尝试通过连接从两个表中获取数据。
  • 同意。这绝对是使用一个查询没有意义的情况。
  • 我需要这个,因为我想创建一个包含所有数据的 XML 文件(所有帖子 + 10 个最近的 cmets/帖子)。当你有 100 个帖子时,我不知道最好的解决方案是什么。那意味着你必须执行 100 个 sql 查询?
  • 不需要2个查询:一个抓取帖子详情,一个抓取评论详情。当只需要 10 个 cmets 时,使用“LIMIT”和“ORDER BY”SQL 语句。可以使用循环和 mysql_fetch_array() 或类似的东西(取决于您的需要)读取评论查询的结果
【解决方案2】:

如果您使用的是 MySQL,您可以使用 GROUP_CONCAT 函数:

SELECT p.post_id, p.title, GROUP_CONCAT(c.comment_body)
FROM posts
LEFT JOIN comments c ON c.parent_id = p.post_id
GROUP BY p.post_id

【讨论】:

    【解决方案3】:

    我能想到的最简单的方法是遍历所有返回的行并将它们分组到一个关联数组中,其中键是帖子 ID。然后,您可以遍历该关联数组并打印每个帖子的 cmets,从组中的第一行获取帖子标题。

    【讨论】:

      【解决方案4】:

      获取数据时,只需使用字段名称,例如: $result = mysql_query("SELECT p.post_id, p.title, c.comment_body FROM posts p LEFT JOIN cmets c ON c.parent_id = p.post_id");

      while($row = mysql_fetch_array($result))
        {
        echo $row['title'] . " " . $row['comment_body'];
        echo "<br />";
        }
      

      发件人:http://www.tizag.com/mysqlTutorial/mysqljoins.php

      【讨论】:

      • 但是如果有多个 cmets 怎么办?
      • 下一条评论应该是 $row['comment_body'][1]
      【解决方案5】:

      对于 MySQL:

      SELECT p.post_id, p.title, GROUP_CONCAT(c.comment_body), count(*) as coment_cnt
      FROM
          posts p
              LEFT JOIN comments c ON (p.post_id = c.parent_id)
      GROUP BY
          p.post_id
      

      【讨论】:

        【解决方案6】:

        “但这并没有像我预期的那样成功”

        ...但你没有说出你的预期。

        假设您的查询中隐含的架构是正确的,那么只显示一次帖子是不费吹灰之力的:

        $lastpostid=false;
        while ($r=mysql_fetch_assoc($result)) {
          if ($r['post_id']!=$lastpost) {
             print "Post: " . $r['title'] . "<br />\n";
             $comment_id=1;
             $lastpost=$r['post_id'];
          }
          print "Comment # $comment_id : " . $r['comment_body'] . "<br />\n";
          $comment_id++;
        }
        

        但正如我所说,这意味着您的查询是正确的(即 cmets 不是分层的)。

        C.

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-14
          • 2013-05-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-31
          相关资源
          最近更新 更多