【问题标题】:SQL Join grouping for tree-like result用于树状结果的 SQL Join 分组
【发布时间】:2015-02-10 06:13:15
【问题描述】:

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

我一直在使用一个简单的.json 文件(手写),其中包含我网站的所有数据。这由 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,但这只给了我第一个孩子。

【问题讨论】:

  • 您可能需要提供样本数据和预期结果。
  • 我添加了一些示例数据。至于预期的结果,我不知道它们应该如何(这就是我的问题的重点)
  • 现在考虑到这些数据,请解释为什么您的查询不能满足您的需求以及您希望得到什么。
  • 在这种情况下,我对同一篇文章有​​ 2 次引用,每次引用我得到 1 行,并填充了所有文章/页面元素。这听起来像是重复了很多数据,只有一次就足够了。因此,我问是否有办法获得更“树状”的答案,可以消除一些重复的数据
  • 看看GROUP_CONCAT。只要您不介意将其作为字符串取回,它就可以展平您的数据。

标签: mysql sql join tree grouping


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    相关资源
    最近更新 更多