2012-08-23 80 views
2

我有一個數據庫表中的類別和子類別的表。其內部結構是:我如何做這個sql技巧

id int not null primary 
name text 
subcatfrom int 

它包含一些類別及其子類別的行。我想「選擇」 SQL命令爲每根類別取後,分類和分組及其子類別如下例如:

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

這可能嗎?

+1

Oracle中這是CONNECT BY – Randy

+0

http://stackoverflow.com/questions/7631048/connect-通過事先等效爲mysql – Vikdor

+1

[MySql不支持遞歸查詢](http://stackoverflow.com/a/7631222/572644) –

回答

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意味着它是一個父類 現在的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) 
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子句將此數據限制爲不是其他任何子類別的頂級類別。

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;