【问题标题】:Howto get tree view? mysql如何获得树视图? mysql
【发布时间】:2013-12-16 07:15:26
【问题描述】:

我有以下表格:

规格

id | name
-----------
1  | hello
2  | world
3  | foo
4  | bar

属性

name   | value  | specID
---------------------
status | finish | 1
parent | 2      | 1
status | work   | 2
parent | 3      | 2
status | ...    | 4
parent | 3      | 4

现在我想说:

列出 specID 3 下的所有规范。

我现在没有降级,但结果一定是:

id | name  | parent
------------------
 3 | foo   |  NULL
 2 | world | 3
 1 | hello | 2
 4 | bar   | 3

我如何在 mysql 中做到这一点?

【问题讨论】:

    标签: mysql sql select join left-join


    【解决方案1】:

    你可以这样试试

    SELECT 
        s.id,
        s.name,
        IFNULL(p.value,0) as parent
    FROM  specifications s
    LEFT JOIN properties p 
        ON p.specID = s.id 
        AND p.name  ='parent'
    ORDER BY parent 
    

    输出

    | ID |  NAME | PARENT |
    |----|-------|--------|
    |  3 |   foo |      0 |
    |  1 | hello |      2 |
    |  2 | world |      3 |
    |  4 |   bar |      3 |
    

    Fiddle

    【讨论】:

    • 可以说,从规范 4 开始?我不需要一棵树,我必须设置一个“起点”。
    • 你能解释一下你的意思吗?
    • 想象一下我的表“规范”有数千行。不同的规格树。我需要指定“给我看树,从规范 3 开始作为根”。你明白吗?
    • @AlexanderG。看看this。我相信这会对你有所帮助
    • 很遗憾,我不明白你的链接:/
    【解决方案2】:

    试试这个:

    SELECT s.id, s.name, p.value AS parent
    FROM specifications s 
    LEFT JOIN properties p ON s.id = p.specID AND p.name = 'parent'; 
    

    【讨论】:

    • 没有值属性!
    • @ktaria 值是属性表中的一列
    • 可以说,从规范 4 开始?我不需要一棵树,我必须设置一个“起点”。
    【解决方案3】:

    MySQL 没有任何语法结构可以让您编写递归查询。因此,使用此模式,没有方便的方法来检索完整的树 - 至少不是使用 SELECT 查询。

    您可以尝试将架构重新设计为“物化路径”、“嵌套集”或“嵌套间隔”解决方案。有关详细信息,请参阅这些论文:

    http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ http://sigmod.acm.org/publications/sigmod-record/0506/p47-article-tropashko.pdf

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-12
      • 2018-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多