Php 获取所有新闻和评论

Php 获取所有新闻和评论,php,sql,mysql,Php,Sql,Mysql,我试图编写一个查询代码,获取所有新闻和每个新闻的所有评论。 我目前的查询是: 选择n.*, c、 *作为评论 来自新闻 加入c上的评论(c.news\u id=n.id) 但是当我以数组的形式获取查询时,它会按注释给我一个key,我希望在子数组中有一个key by news和所有注释 比如: Array ( [0] => Array ( [id] => 1 // news' id ... // rest of news'

我试图编写一个查询代码,获取所有新闻和每个新闻的所有评论。 我目前的查询是:

选择n.*,
c、 *作为评论
来自新闻
加入c上的评论(c.news\u id=n.id)
但是当我以数组的形式获取查询时,它会按注释给我一个key,我希望在子数组中有一个key by news和所有注释

比如:

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
)

谢谢

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

你在用什么ORM吗?你可能想考虑一下:

  • ,PHP5.1 plus的开源ORM,自由软件(GNU LGPL)
  • ,PHP5.2.3开源ORM,自由软件(GNU LGPL)
  • ,适用于PHP5的ORM和查询工具包,灵感来自Apache Torque,免费软件(GNU LGPL)
  • ,PHP5.0.4或更新版本的开源ORM,免费软件(BSD)
  • ,数据库类创建者和查询生成器,灵感来源于Prope,但更易于安装的免费软件
  • 数据映射器实现(新BSD)
  • PHP5.1.6或更新版本的开放源码ORM(beta版),使用类似于Hibernate(新BSD)的方法
  • PHP5的开放源码ORM,使用代码生成(应该可以连接其他数据库驱动程序,但开箱即用仅包括MySQL支持。)(FreeBSD)

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

你在用什么ORM吗?你可能想考虑一下:

  • ,PHP5.1 plus的开源ORM,自由软件(GNU LGPL)
  • ,PHP5.2.3开源ORM,自由软件(GNU LGPL)
  • ,适用于PHP5的ORM和查询工具包,灵感来自Apache Torque,免费软件(GNU LGPL)
  • ,PHP5.0.4或更新版本的开源ORM,免费软件(BSD)
  • ,数据库类创建者和查询生成器,灵感来源于Prope,但更易于安装的免费软件
  • 数据映射器实现(新BSD)
  • PHP5.1.6或更新版本的开放源码ORM(beta版),使用类似于Hibernate(新BSD)的方法
  • PHP5的开放源码ORM,使用代码生成(应该可以连接其他数据库驱动程序,但开箱即用仅包括MySQL支持。)(FreeBSD)

您不能在一个查询中完成这项工作-最好是接受您得到的查询并对结果进行后期处理,以获得所需的数据结构

更详细地说,任何SQL查询只能返回二维数据数组——一个维度用于列,一个维度用于匹配行。在你的例子中,你真正想要的更像是一张三维的桌子

还要注意,在您编写的查询中,对于每篇文章的每一条评论,都会一次又一次地返回所有的
新闻
数据。这是对带宽和数据库服务器资源的低效利用

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


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

在一个查询中无法做到这一点-最好接受您得到的查询并对结果进行后期处理,以获得所需的数据结构

更详细地说,任何SQL查询只能返回二维数据数组——一个维度用于列,一个维度用于匹配行。在你的例子中,你真正想要的更像是一张三维的桌子

还要注意,在您编写的查询中,对于每篇文章的每一条评论,都会一次又一次地返回所有的
新闻
数据。这是对带宽和数据库服务器资源的低效利用

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


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

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

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

tab_news:news_id,news

选项卡cmt:cmt id、新闻id、cmt

现在编写如下查询:


从tab_news n internal join tab_cmt c on(c.news\u id=n.news\u id)中选择n.news,c.cmt

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

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

tab_news:news_id,news

选项卡cmt:cmt id、新闻id、cmt

现在编写如下查询:

从选项卡\u news n internal join选项卡\u cmt c on(c.news\u id=n.news\u id)中选择n.news,c.cmt

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;
}