【问题标题】:How to output this hierarchical Mysql Structure?如何输出这个分层的 Mysql 结构?
【发布时间】:2013-11-06 02:08:14
【问题描述】:

我得到了以下Mysql结构

categories tab
--------------------------
layer1 | layer2 | layer3
--------------------------
echo   | brain  |
echo   |        |
echo   | foo    |
echo   | brain  | diffuse
echo   | brain  | clear
echo   | cheesy | nuts
echo   | cheesy |   

我尝试将以下结构输出为 HTML 列表

  • 回声

    • (...) 大脑

    • (...) 俗气的

(...) 应该提示用户,brain 和 cheesy 也可以提供子元素。

例如当他单击大脑时,应显示以下视图:

  • 回声

    • 大脑

      • 清除

      • 漫射

    • (...) 俗气的

这让我发疯...尝试了很多 GROUP/ORDER BY、UNION 和 CASE 变体,但我不明白 -.-

【问题讨论】:

    标签: mysql structure hierarchy hierarchical-data


    【解决方案1】:

    鉴于您存储数据的方式,您可能无法在一个 SQL 查询中执行此操作。否则它会变得如此复杂,以至于这样做是个坏主意。记住 Brian Kernighan 的建议:

    首先,调试的难度是编写代码的两倍。因此,如果您尽可能巧妙地编写代码,那么根据定义,您还不够聪明,无法对其进行调试。

    你可以很容易地完成第一个查询:

    SELECT layer1, layer2, COUNT(layer3) AS dotdotdot
    FROM categories
    WHERE layer1 = 'echo'
    GROUP BY layer1, layer2
    

    如果dotdotdot 不为空,则第 3 层中的子类别数量非零。

    如果用户突出显示“大脑”,那么当您在循环中显示第一个查询的结果时,再运行一个查询:

    SELECT layer3
    FROM categories
    WHERE layer2 = 'brain'
    

    就是这样。运行两个查询而不是在一个查询中找到一些巧妙的方法来完成这一切似乎很无聊,但是你会惊讶于一个复杂的问题在你打破时变得更简单更有效率的频率将其分解为更小的问题。

    如果您想要更精简的内容,请查看我的演示文稿Models for Hierarchical Data with SQL and PHP。我展示了您尝试实现的那种问题的示例:选择性扩展层次结构中的给定级别。但我通过与您不同的方式存储数据来解决问题。

    【讨论】:

    • 哇 .. 这么简单 ... o.O ... 谢谢 :-D 我想看看你的幻灯片,这是一件有趣且漂亮的演示文稿。有没有“最好”的模型?
    • 在大多数设计决策中,一个模型可能是给定项目的最佳模型。但是不同的项目有不同类型的查询,它们需要针对分层数据运行。例如,如果你永远不需要查询整棵树,而只需要查询直接父级或直接子级,那么 Adjacency List 就足够了,而且非常简单,不会出现异常等。
    • 对于上述问题,您更喜欢哪种型号?
    • 我更喜欢闭包表。我在演示文稿中展示了此类查询的解决方案。它也可以与路径枚举一起使用,但是由于索引的工作方式,您会牺牲一些效率。用 Adjacency List 或 Nested Sets 做查询太难了。
    • 我在上面的回答中显示的内容假设您更改存储数据的方式。通常,当人们在 StackOverflow 上提问时,他们有一个限制,即他们无法更改数据的存储方式,因为有太多其他应用程序依赖它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 2022-10-25
    相关资源
    最近更新 更多