获取所有新闻和所有评论

时间:2009-04-24 21:00:24

标签: php sql mysql

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

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

但是当我将查询作为数组获取时,它会通过注释为我提供一个键,我希望通过新闻和子数组中的所有注释获得一个键。

类似的东西:

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
)

谢谢!

3 个答案:

答案 0 :(得分:2)

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

您使用的是任何形式的ORM吗?您可以考虑查看:

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

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

答案 1 :(得分:2)

您不能在一个查询中执行此操作 - 最好采取您已获得的查询并对结果答案进行后处理以获取所需的数据结构。

进一步详细说明 - 任何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;
}

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

答案 2 :(得分:0)

您可以使用内部联接来获得单个查询中的结果。

假设您的数据库结构如下:

tab_news:news_id,news

tab_cmt:cmt_id,news_id,cmt

现在编写如下查询:

从tab_news选择n.news,c.cmt n内连接tab_cmt c on(c.news_id = n.news_id)