【问题标题】:Fetch all news and all comments获取所有新闻和所有评论
【发布时间】:2009-04-24 21:00:24
【问题描述】:

我正在尝试编写一个查询来获取所有新闻以及每个新闻的所有 cmets。 我目前的查询是:

SELECT n.*,
       c.* AS comments
  FROM news n
       JOIN comments c ON (c.news_id = n.id)

但是当我以数组的形式获取查询时,它通过注释给了我一个键,我想通过新闻和子数组中的所有 cmets 获得一个键。

类似:

Array
(
    [0] => Array
    (
        [id] => 1 // news' id
        ...       // rest of news' data
        [comments] = Array
        (
            [id] => 1 // comment's id
            ...       // rest of comments' data
        )
    ),
    ... // all other news
)

谢谢!

【问题讨论】:

    标签: php sql mysql


    【解决方案1】:

    您不能在一个查询中做到这一点 - 最好获取您已获得的查询并后处理生成的答案以获得您需要的数据结构。

    进一步详细说明 - 任何 SQL 查询都只能返回二维数据数组 - 一维用于列,一维用于匹配行。在您的情况下,您实际上所追求的更像是一个三维表。

    另请注意,在您所写的查询中,将针对每篇文章的每条评论一遍又一遍地返回所有 news 数据。这是对数据库服务器带宽和资源的低效使用。

    这样做可能更有效(在伪代码中):

    SELECT * FROM news
    ...
    foreach ($rows as $row) {
      $row['comments] = array();
      $news[$row['id']] = $row;
    }
    
    SELECT * FROM comments
    ...
    foreach ($rows as $row) {
      $news[$row['news_id']]['comments'][] = $row;
    }
    

    第一个查询获取所有新闻文章并将它们放入一个数组中。第二个查询获取 cmets,并在每篇新闻文章的结构中累积一个单独的数组。

    【讨论】:

      【解决方案2】:

      我假设它返回的是单个记录而不是数据结构。您将需要自己将这些记录分组到数据结构中。如果可能的话,我会保留一些示例代码,但这不能直接通过 SQL 完成。 (因为您也没有直接从数据库中取回 PHP)

      您是否使用任何类型的 ORM?您不妨考虑看看:

      • Rocks,适用于 PHP 5.1 plus 的开源 ORM,免费软件 (GNU LGPL)
      • Doctrine,适用于 PHP 5.2.3 的开源 ORM,免费软件 (GNU LGPL)
      • Propel,适用于 PHP 5 的 ORM 和 Query-Toolkit,灵感来自 Apache Torque,免费软件 (GNU LGPL)
      • EZPDO,适用于 PHP 5.0.4 或更新版本的开源 ORM,免费软件 (BSD)
      • DABL,数据库类创建者和查询构建者,受 Propel 启发,但更易于安装,免费软件
      • Data Shuffler 数据映射器实现(新 BSD)
      • Outlet PHP 5.1.6 或更高版本的开源 ORM(测试版),使用类似于 Hibernate(新 BSD)的方法
      • Coughphp PHP5 的开源 ORM,使用代码生成(应该可以连接其他数据库驱动程序,但开箱即用只包括 MySQL 支持。1)(FreeBSD)

      http://en.wikipedia.org/wiki/List_of_object-relational_mapping_software#PHP

      【讨论】:

        【解决方案3】:

        您可以使用内部联接在单个查询中获取结果。

        假设你的数据库结构是这样的:

        tab_news : news_id, 新闻

        tab_cmt : cmt_id, news_id, cmt

        现在编写如下查询:

        select n.news, c.cmt from tab_news n inner join tab_cmt c on (c.news_id=n.news_id)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-10-20
          • 1970-01-01
          • 2021-02-20
          • 2019-07-01
          • 2014-03-24
          • 2011-04-18
          • 2013-02-11
          • 1970-01-01
          相关资源
          最近更新 更多