代码之家  ›  专栏  ›  技术社区  ›  Mike

按父母和子女分类

  •  0
  • Mike  · 技术社区  · 6 年前

    这里有一张简单的桌子:

    id, title, parent, ordering
    ---------------------------
    3242, TitleB, 0, 1
    6574, TitleBA, 3242, 1
    2346, TitleBB, 3242, 2
    2344, TitleA, 0, 1
    7346, TitleAC, 2344, 3
    3574, TitleAB, 2344, 2
    2256, TitleAA, 2344, 1
    1435, TitleC, 0, 1
    4354, TitleCA, 1435, 1
    

    TitleA
      TitleAA
      TitleAB
      TitleAC
    TitleB
      TitleBA
      TitleBB
    TitleC
      TitleCA
    

    因此,行应该按第一个父项排序,然后按其子项排序。然后是下一个父项,然后是它的子项,依此类推。

    父母自己的命令无关紧要!标题只是为了更好地理解,不能用于排序。重要的是,孩子们在父母的领导下得到分类。

    这是我做的最后一个查询:

    SELECT *
    FROM table t1
         LEFT JOIN table t2
         ON t2.id = t1.parent 
    ORDER BY COALESCE(t1.ordering, t2.ordering), t2.ordering   
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   Spectorsky    6 年前

    部分解决方案可能是以下查询:

    SELECT t.title FROM t GROUP BY IF(parent=0,id,parent), 
    IF(parent=0,-1,ordering), t.title ORDER BY IF([parent]=0,
    id,parent), IF(parent=0,-1,ordering);
    

    TitleC
    TitleCC
    TitleA
    TitleAA
    TitleAB
    TitleAC
    TitleB
    TitleBA
    TitleBB
    

    要缩进每个组的头,可以使用类似于MS Access中的report的方法。 我已经在msaccess中准备好了它,所以MySQL语法可能有点不同。

        2
  •  1
  •   sxn SXN    6 年前
    SELECT *, if(parent = 0, id, parent) as main_order
    FROM `tbl`
    ORDER by main_order, ordering, parent
    

    order sql tree hierarchy