1

我得到了以下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 变体,但我不明白 -.-

4

1 回答 1

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。我展示了您尝试实现的那种问题的示例:选择性扩展层次结构中的给定级别。但我通过与您不同的方式存储数据来解决问题。

于 2013-11-06T02:20:25.817 回答