首先,我想说我已经做了一些研究,但是我仍然无法在我的问题上得到明确的答案。请随时给我指向我可能错过的地方的链接。

长期以来,我一直在使用一个简单的.json文件(手写),其中包含我网站的所有数据。这是由JQuery解析的,然后由JQuery构建整个页面(请参见my personnal webpage)。由于许多原因(易于编辑,即使在阻止javascript的情况下也能正常工作的网页),我想为其构建PHP / MySQL版本。

我的问题是将.json文件的树结构转换为单个SQL查询。

我的数据库具有用于pagesarticlescitations的表,在一对多模型中,每个表都具有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,但这只给了我第一个孩子。

最佳答案

如果您的目标是获取所有数据以构建树结构,那么没有比上述查询更好的方法了。您不必担心重复问题,因为无论如何您都必须解析数据,并且您想立即从数据库中加载所有数据这一事实表明您的数据库根本不大。只需通过按顺序添加article_id和citation_id来扩展order by子句,以使整个数据集正确排序,以便您可以通过它并构建树。

就是说,您可以通过发出多个查询来解决重复问题,首先获取所有页面,然后获取每个页面的所有文章,然后获取每个文章的所有引文。但是,这可能会比较慢,因为您将有很多数据库往返。为了使这种解决方案有效,您必须调整用户界面以根据需要动态加载数据。例如,您仅显示页面列表,并且当用户单击单个页面时,将执行查询以获取该单个页面的文章。

关于mysql - SQL Join分组以获得树状结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28425290/

10-11 08:05