2

カテゴリとサブカテゴリのデータベースにテーブルがあります。その内部構造は次のとおりです。

id int not null primary 
name text
subcatfrom int

カテゴリとそのサブカテゴリの行がいくつか含まれています。たとえば、次のように、「SELECT」SQLコマンドでカテゴリを取得し、その後、ルートカテゴリごとにサブカテゴリをグループ化します。

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

出来ますか ?

4

3 に答える 3

1

元の質問では、サブカテゴリを別々の行に配置したいと考えています。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

これは何をしているのですか?内部結合 all は、すべてのカテゴリとサブカテゴリをまとめています。テーブルに必要なものと、並べ替えのための情報を割り当てています。全体的な順序は、「親」カテゴリ名によるものです。

where 句は、このデータを他のサブカテゴリではないカテゴリ (最上位のカテゴリ) に制限しています。

于 2012-08-23T13:14:47.087 に答える
1

1. 親子関係は 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;
于 2012-08-23T13:18:14.443 に答える
1

とても簡単ですが、この構造で

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 は、それが親カテゴリであることを意味します。

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)
于 2012-08-23T13:06:29.453 に答える