我正在尝试编写一个查询来获取所有新闻以及每条新闻的所有评论。 我目前的疑问是:
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
)
谢谢!
答案 0 :(得分:2)
我假设它正在返回单个记录而不是数据结构。您需要将这些记录自己分组到数据结构中。如果可能的话,我会坚持一些示例代码,但这不能通过SQL直接完成。 (因为你没有直接从数据库中获取PHP)
您使用的是任何形式的ORM吗?您可以考虑查看:
http://en.wikipedia.org/wiki/List_of_object-relational_mapping_software#PHP
答案 1 :(得分: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 :(得分:0)
您可以使用内部联接来获得单个查询中的结果。
假设您的数据库结构如下:
tab_news:news_id,news
tab_cmt:cmt_id,news_id,cmt
现在编写如下查询:
从tab_news选择n.news,c.cmt n内连接tab_cmt c on(c.news_id = n.news_id)