【问题标题】:Order row selection by multiple columns按多列排序行选择
【发布时间】:2011-07-01 08:39:56
【问题描述】:

我有一个数据库

id    |     parentid     |       name
1     |        0         |      CatOne
2     |        0         |      CatTwo
3     |        0         |      CatThree
4     |        1         |      SubCatOne
5     |        1         |      SubCatOne2
6     |        3         |      SubCatThree

如何选择这些猫 订购方式为idparentid?那是

CatOne 1
--SubCatOne 4
--SubCatOne2 5
CatTwo 2
CatThree 3
--SubCatThree 6

【问题讨论】:

  • @a_horse_with_no_name,对不起,MySQL
  • 嵌套的父级联接是否更深,还是只有两层层次结构?

标签: mysql sql select sql-order-by


【解决方案1】:

如果您要按以下方式排序:ORDER BY parentid, id

然后你会得到你正在寻找的订单,但它不会像你的例子那样有意或任何东西。

SQL 可能不是进行此类缩进组的最佳媒介。你可以……但最好在你的前端应用中完成

编辑:抱歉误读问题,Eric Petroelje 所说的。

edit edit:或者从表中选择,连接回自身,(一个用于 Cat,一个用于 SubCat)然后指定不同的顺序,每个表中一个。

【讨论】:

    【解决方案2】:

    假设您的表名为猫,试试这个:

    select * from  cats
    order by
          case when parentid = 0 then id else parentid end,
          case when parentid = 0 then 0 else id end
    

    已更新以包含父级与子级相比具有更高 id 的情况

    【讨论】:

    • 是的,这行得通……但是,我唯一关心的是。如果这是在自动递增的表中,并且子类别被重新分类为比 IT ID 更高的类别编号,则子类别将出现在其各自的父类别之上...
    【解决方案3】:

    你可以试试这个。它与您指定的格式不完全一致,但是否符合您的要求?

    SELECT c.id,c.name,sc.id as subcatid,sc.name as subcatname
    FROM cats c LEFT JOIN cats sc ON c.id=sc.parentid
    WHERE c.parentid=0 order by c.id,sc.id;
    

    它产生以下内容:

    +------+----------+----------+-------------+
    | id   | name     | subcatid | subcatname  |
    +------+----------+----------+-------------+
    |    1 | CatOne   |        4 | SubCatOne   |
    |    1 | CatOne   |        5 | SubCatOne2  |
    |    2 | CatTwo   |     NULL | NULL        |
    |    3 | CatThree |        6 | SubCatThree |
    +------+----------+----------+-------------+
    

    【讨论】:

      【解决方案4】:

      这个:

      select id as parentId,
      0 as sortOrder,
      id,
      name
      from cats 
      where parentId = 0
      union all
      select parentId,
      1 as sortOrder,
      id,
      name
      from cats 
      where parentId > 0
      order by parentId, sortOrder, name
      

      返回:

      ParentId sortOrder  id   Name
          1       0       1   CatOne
          1       1       4   SubCatOne
          1       1       5   SubCatOne2
          2       0       2   CatTwo
          3       0       3   CatThree
          3       1       6   SubCatThree
      

      【讨论】:

      • 如果 ParentId 上有索引则不会。 11 年来,我在少于 100,000 行的表上没有超过一秒钟的选择。
      【解决方案5】:

      应该这样做...除了名称前的双破折号“--”前缀...

      SELECT 
            t1.name,
            t1.id
         FROM 
            Table1 t1
         ORDER BY 
            case when t1.parentID = 0 then t1.ID else t1.ParentID end,
            case when t1.parentID = 0 then '1' else '2' end,
            t1.id
      

      按 FIRST case/when 的顺序放置所有顶级的项目,或者按主要级别的 ID 放置在次要级别。因此,如果您有超过 1000 个条目,那么尝试使用提供的父 * 1000 示例 hack 将不是问题。第二个 case/when 将在父 ID = 0 时强制到其分组列表的顶部及其下的所有子条目,但在下一个父 ID 之前。

      但是,如果您确实想要双破折号,请更改为

      SELECT 
            if( t1.ParentID = 0, '', '--' ) + t1.name name,
           <rest of query is the same>
      

      【讨论】:

        猜你喜欢
        • 2020-02-27
        • 1970-01-01
        • 2021-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-22
        • 1970-01-01
        相关资源
        最近更新 更多