如何输出这个分层的Mysql结构?

时间:2013-11-06 02:08:15

标签: mysql structure hierarchy hierarchical-data

我得到了以下Mysql结构

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

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

  • 回波

    • (...)脑

    • (...)cheesy

    • FOO

(...)应该是一个提示用户,大脑和俗气也有childelements提供。

e.g。当他点击大脑时,应显示以下视图:

  • 回波

      • 明确

    • (...)cheesy

    • FOO

这让我疯了......试了这么多的GROUP / ORDER BY,UNION和CASE变种但是我得不到它。-.-

1 个答案:

答案 0 :(得分:0)

考虑到存储数据的方式,您可能无法在一个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。我展示了您尝试实现的问题类型的示例:在层次结构中选择性扩展给定级别。但我通过以不同的方式存储数据来解决问题。