2009-04-24 17 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

あなたは1つのクエリでそれを行うことはできません - 最高のあなたが持っているクエリし、必要なデータ構造を取得するための後処理結果の答えを取ります。

さらに詳しく述べると、SQLクエリは、データの2次元配列、つまり列の次元と一致する行の次元だけを返すことができます。あなたの事例では、あなたが実際に何をしているかは、三次元の表のようなものです。

また、書面による照会では、各記事に対するコメントごとに繰り返しすべてのデータが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番目のクエリはコメントを取得し、各ニュース記事の構造内に別々の配列を蓄積します。

2

私はそれが個々のレコードを返すものであり、データ構造ではないと仮定しています。これらのレコードを自分でデータ構造にグループ化する必要があります。可能であれば、私はいくつかのサンプルコードを保持しますが、これはSQLで直接行うことはできません。 (PHPからPHPを直接取得していないので)

あなたはORMを使用していますか?あなたが見て検討すると良いかもしれません:

  • Rocks、PHP 5.1に加えて、フリーソフトウェアのためのオープンソースのORM(GNU LGPL)
  • Doctrine、PHP 5.2.3のためのオープンソースのORM、フリーソフトウェア(GNU LGPL)
  • Propel、PHP 5.0.4以降、フリーソフトウェアのためのApacheトルク、フリーソフトウェア(GNU LGPL)に触発されたPHP 5のためのORMとクエリツールキット、
  • EZPDO、オープンソースのORM(BSD)
  • DABL 、データベースクラス作成者クエリビルダ、Propelのに触発されたが、インストールが簡単、フリーソフトウェア
  • Data Shufflerデータマッパーの実装(新BSD)PHP 5.1.6以降用
  • OutletオープンソースのORM(ベータ版)は、(新を休止状態に同様のアプローチを使用していますBSD)
  • CoughphpオープンソースORM for PHP5は、コード生成を使用します(他のデータベースドライバを接続することは可能ですが、MySQLサポートのみが含まれています)。 1)(FreeBSDの)

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

0

内部結合を使用して、単一のクエリで結果を取得できます。

データベース構造が似ていると仮定します。

tab_news:news_id、ニュース

tab_cmt:C、

選択n.news:cmt_id、news_id、CMT

は今のようなクエリを記述.cmt from tab_news n内部結合tab_cmt c on(c.news_id = n.news_id)

関連する問題