【问题标题】:how i do this sql trick我怎么做这个 sql 技巧
【发布时间】:2012-08-23 12:52:28
【问题描述】:

我在数据库中有一个类别和子类别的表。它的内部结构是:

id int not null primary 
name text
subcatfrom int

它包含一些类别及其子类别的行。我希望“SELECT” sql 命令为每个根类别获取类别并在其后对它们的子类别进行分组,例如:

-cat1
--subcat1
--subcat2
-cat2
--subcat1
--subcat2

有可能吗?

【问题讨论】:

标签: mysql sql database phpmyadmin


【解决方案1】:

原始问题希望将子类别放在单独的行中。这是一种方法:

select name
from ((select category as name, 1 as iscat, category as sortorder
       from t
      ) union all
      (select tsub.category as name 0 as iscat, t.category as sortorder
       from t join
            tsub on
            on t.subcategory_id = s.category_id
      )
     ) a
where not exists (select 1 from category c where c.subcategory_id = a.sortorder limit 1) 
order by sortorder, iscat desc, name

这是在做什么?内部联合全部是汇集所有类别和子类别。它在表格中分配您想要的内容以及用于排序的信息。整体排序是按“父”类别名称。

where 子句将此数据限制为不属于其他任何子类别的类别——顶级类别。

【讨论】:

    【解决方案2】:

    我的假设是—— 1.你只有一级父子关系。即子类别不能有更多的子类别 2.对于顶级类别,subcatfrom的值为0

    SELECT * FROM 
    (
    SELECT NAME AS parent_category_name, '' AS child_category_name FROM categories WHERE subcatfrom = 0
    UNION
    SELECT b.NAME AS parent_category_name, a.NAME AS child_category_name FROM categories a JOIN     categories b ON a.subcatfrom = b.id
    ) a ORDER BY a.parent_category_name, a.child_category_name;
    

    【讨论】:

      【解决方案3】:

      这很容易,但使用这种结构

      Table: category_id , name , parent_id
      

      样本数据

      category_id    name   parent_id
         1           A        0
         2           B        0
         3           C        1
         4           D        1
      

      这意味着 A 是一个有 2 个子类别 C 和 D 的类别。而 parent_id 0 表示它是一个父类别 现在的sql是

      SELECT lc.category_id,
             lc.name,
             rc.subcategories
      FROM categories
      LEFT JOIN (
          SELECT  
              subcategory_id , 
              GROUP_CONCAT(name) AS subcategories  
          FROM categories)  AS rc 
      ON lc.category_id = rc.parent_id
      

      这将为您提供以下结果

      category_id    name      subcategories
         1           A          C,D
         2           B          (null)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-21
        • 1970-01-01
        • 2014-02-05
        • 1970-01-01
        • 1970-01-01
        • 2019-06-23
        • 2011-07-01
        相关资源
        最近更新 更多