Получить все новости и все комментарии - PullRequest
0 голосов
/ 25 апреля 2009

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

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
)

Спасибо!

Ответы [ 3 ]

2 голосов
/ 25 апреля 2009

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

Более подробно: любой запрос 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 голосов
/ 25 апреля 2009

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

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

  • Rocks , ORM с открытым исходным кодом для PHP 5.1 plus, бесплатное программное обеспечение (GNU LGPL)
  • Doctrine , 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)
  • 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 голосов
/ 25 апреля 2009

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

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

tab_news: news_id, news

tab_cmt: cmt_id, news_id, cmt

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...