Я пытаюсь закодировать запрос, который получает все новости и все комментарии для каждой новости. Мой текущий запрос:
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? Возможно, вы захотите рассмотреть:
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)