2009-04-24 75 views
0

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

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 
) 

谢谢!

回答

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

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

你使用的是哪种ORM?您不妨考虑在寻找:

  • Rocks,对于PHP 5.1加分,免费软件,开源ORM(GNU LGPL)
  • Doctrine,对于PHP 5.2.3开源ORM,自由软件(GNU LGPL)
  • Propel,ORM和查询的工具包PHP 5,由Apache的转矩,自由软件(GNU LGPL)
  • EZPDO,为PHP 5.0.4或更新的版本,自由软件(BSD)开源ORM启发
  • DABL ,数据库类创建者和查询生成器,通过行走的启发,但更容易安装,免费软件
  • Data Shuffler数据映射实现(新BSD)
  • Outlet开源ORM(测试版)5.1.6 PHP或更高版本,使用类似于休眠的方法(新BSD)
  • Coughphp PHP5的开放源码ORM使用代码生成(应该可以连接其他数据库驱动程序,但是现成的方式只包含MySQL支持。 1)(FreeBSD的)

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

0

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

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

tab_news:news_id,新闻

tab_cmt:cmt_id,news_id,CMT

写信查询,如:

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