2009-04-24 111 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)