2009-04-24 4 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. (так как вы не получили обратно PHP непосредственно из БД)

Вы используете какой-либо ORM? Вы можете рассмотреть глядя на:

  • Rocks, Open Source ORM для PHP 5.1 плюс, свободное программное обеспечение (GNU LGPL)
  • Doctrine, Open Source ORM для PHP 5.2.3, свободное программное обеспечение (GNU LGPL)
  • Propel, ORM и Query-Toolkit для PHP 5, вдохновленный Apache Torque, свободного программного обеспечения (GNU LGPL)
  • EZPDO, Open Source ORM для PHP 5.0.4 или новее, свободное программное обеспечение (BSD)
  • DABL , Создатель класса базы данных и Query Builder, вдохновленный Propel, но проще в установке, свободное программное обеспечение
  • Data Shuffler реализация картографа данных (New BSD)
  • Outlet Открытый исходный код ORM (бета) для PHP 5.1.6 или более поздней версии, использует подход, аналогичный Hibernate (New BSD)
  • Coughphp ORM с открытым исходным кодом для PHP5, использует генерацию кода (должно быть возможно подключить другие драйверы базы данных, но из коробки включена поддержка только 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, СМТ

сейчас пишу запрос, как:

выберите n.news, с .cmt from tab_news n внутреннее соединение tab_cmt c on (c.news_id = n.news_id)

Смежные вопросы