Получить все новости и все комментарии

Я пытаюсь закодировать запрос, который получает все новости и все комментарии для каждой новости. Мой текущий запрос:

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 ) 

Благодаря!

Вы не можете сделать это в одном запросе – лучше всего взять запрос, который у вас есть, и обработать полученный ответ, чтобы получить необходимую структуру данных.

Чтобы уточнить, любой 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; } 

Первый запрос получает все новостные статьи и помещает их в массив. Второй запрос получает комментарии и накапливает отдельный массив в структуре каждой новостной статьи.

Я предполагаю, что он возвращает отдельные записи, а не структуры данных. Вам нужно будет сгруппировать эти записи в структуру данных. Я бы пропустил пример кода, если это возможно, но это невозможно сделать непосредственно через SQL. (так как вы не получили обратно PHP непосредственно из БД)

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

  • Rocks , Open Source ORM для PHP 5.1 plus, бесплатное программное обеспечение (GNU LGPL)
  • Doctrine , Open Source ORM для PHP 5.2.3, бесплатное программное обеспечение (GNU LGPL)
  • Propel , ORM и Query-Toolkit для PHP 5, вдохновленные Apache Torque, бесплатное программное обеспечение (GNU LGPL)
  • EZPDO , ORM с открытым исходным кодом для PHP 5.0.4 или более новое, бесплатное программное обеспечение (BSD)
  • DABL , создатель класса базы данных и построитель запросов, вдохновленный Propel, но более простой в установке, бесплатное программное обеспечение
  • Data Shuffler Реализация карты данных (новый BSD)
  • Openlet ORM (бета) с открытым исходным кодом для PHP 5.1.6 или новее использует подход, похожий на Hibernate (новый BSD)
  • Coughphp Open ORM для PHP5 использует генерацию кода (должно быть возможно подключить другие драйверы базы данных, но из коробки включена поддержка только MySQL. 1 ) (FreeBSD)

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

вы можете использовать внутреннее соединение для получения результата в одном запросе.

Предположим, что ваша структура базы данных похожа:

tab_news: news_id, новости

tab_cmt: cmt_id, news_id, cmt

теперь напишите запрос как:

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