我正在尝试编写一个查询,以获取每个新闻的所有新闻和所有评论。我当前的查询是:
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针对每篇文章的每个注释将一遍又一遍地返回所有数据。这是对数据库服务器带宽和资源的低效率使用。
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; }
第一个查询获取所有新闻文章,并将它们放入数组中。第二个查询获取评论,并在每个新闻文章的结构内累积一个单独的数组。