首先,我想说我做了一些研究,但我仍然无法在我的问题上得到明确的答案。请随时给我链接到我可能错过的地方。
我一直在使用包含我网站所有数据的简单.json
文件(手写)。这是由JQuery解析的,然后由它构建整个页面(参见my personnal webpage)。出于多种原因(易于编辑,即使在javascript被阻止时也有工作网页)我想构建它的PHP / MySQL版本。
我的问题是将.json
文件的树结构转换为单个SQL查询。
我的数据库有pages
,articles
和citations
的表,每个表都有一对多模型中的ID和外键(对于那里的父亲)。
Pages
----------------------
Page_ID | Page_Title
----------------------
0 | About
2 | Work
3 | Publication
Articles
------------------------------------
Article_ID | Page_ID | Article_Title
------------------------------------
0 | 0 | About me
1 | 3 | Articles
Citations
-----------------------------------------
Citation_ID | Article_ID | Citation_Title
-----------------------------------------
0 | 3 | My fst quote
1 | 3 | My snd quote
到目前为止,我构建了以下查询:
SELECT * FROM pages
LEFT OUTER JOIN articles
ON pages.Page_ID = articles.Page_ID
LEFT OUTER JOIN citations
ON articles.Article_ID = citations.Article_ID
ORDER BY pages.Page_Order IS NULL, pages.Page_Order ASC
然而,这让我得到了一个有多个儿子/大儿子的多个时间元素。
有没有更好的方式来代表树?我试着看GROUP BY
,但这只给了我第一个孩子。
答案 0 :(得分:0)
如果您的目标是获取所有数据以构建树结构,那么没有比上述查询更好的方法了。您不应该关注重复问题,因为您无论如何都必须解析数据,并且您想要立即从数据库加载所有数据这一事实表明您的数据库根本不是很大。只需通过按顺序添加article_id和citation_id来扩展order by子句,以使整个数据集正确排序,这样您就可以通过它来构建树。
也就是说,您可以通过发出多个查询来解决重复问题,首先获取所有页面,然后是每个页面的所有文章,然后是每篇文章的所有引文。然而,这可能会更慢,因为你会有很多数据库往返。要使此类解决方案有效,您必须调整用户界面以动态加载数据,因为它的请求。例如,您只显示一个页面列表,当用户单击一个页面时,将执行一个查询,以获取该单个页面的文章。