所有
提前抱歉这个含糊不清的标题。
这就是我要做的......
我正在开发一个需要查询数据库以获取项目列表的应用程序。该项目列表将被格式化为XML文档,该文档将返回到查询前端。
为了简化,我们假设这些项目是书籍。每本书都有以下属性:ISBN,标题,作者,价格。每本书也有0到n条评论
因此,数据存储在2个表中:“book_info”和“book_reviews”。每本书在“book_info”中有一行,在“book_reviews”中有0到n行。
我希望返回的XML看起来像这样:
<books>
<book isbn='xxxxxx' title='abcde' author='xzy' price='99.99'>
<review>blah, blah, blah</review>
</book>
<book isbn='xxxxxx' title='abcde' author='xzy' price='99.99'>
<review>blah, blah, blah</review>
<review>blah, blah, blah</review>
<review>blah, blah, blah</review>
</book>
<book isbn='xxxxxx' title='abcde' author='xzy' price='99.99' />
</books>
正如你所看到的,第一本书有一篇评论,第二本有三本,第三本没有。
我的问题是:构建这样的结构的最有效方法是什么?
例如,我可以获得这样的书籍列表:
Select isbn, title, author, price from book_info where title like "%learn to%"
通过迭代结果集,我可以构建XML文档。但是如何获得评论呢?
一个显而易见的解决方案是:每次交互,在该行中获取isbn for book,然后再次查询数据库:
select review from book_review where book_review.isbn = [the current isbn]
通过迭代这个“sub”-result集,我可以将子“review”节点添加到当前的book节点。
问题在于,如果初始结果集中有100本书,我必须运行100个SQL命令来查找所有评论。
所以,第二个想法就是:
这意味着只需要两个SQL查询,但需要搜索XML文档。
最终,这些看起来都有点不雅观。由于这似乎是一个常见的问题,我希望它有一个很好的,优雅的解决方案。
对于它的价值,我使用SQL Server和PHP来执行查询并组装XML文档。
非常感谢任何指导和见解。
干杯, 马特
答案 0 :(得分:2)
如果您使用的是Microsoft SQL Server,则可以使用FOR XML子句为您生成XML。如果你想要获得精确的格式化,那么用法可能有点棘手,但它的用途非常广泛。
如果你真的真的需要自己生成它,那么只需使用一个选择加入书评。如果某人还没有从PHP中的结果集功能编写某种XML生成器,我会感到有些惊讶。
示例查询:
SELECT
BI.isbn,
BI.title,
BI.author,
BI.price,
BR.review
FROM
Book_Info BI -- It's usually considered bad form to name a table suffixed with "Info" or "Data". Just "Books" would be better
LEFT OUTER JOIN Book_Reviews BR ON BR.isbn = BI.isbn
WHERE
BI.title LIKE '%learn to%'
ORDER BY
BI.isbn