我有一個數據庫表中的類別和子類別的表。其內部結構是:我如何做這個sql技巧
id int not null primary
name text
subcatfrom int
它包含一些類別及其子類別的行。我想「選擇」 SQL命令爲每根類別取後,分類和分組及其子類別如下例如:
-cat1
--subcat1
--subcat2
-cat2
--subcat1
--subcat2
這可能嗎?
我有一個數據庫表中的類別和子類別的表。其內部結構是:我如何做這個sql技巧
id int not null primary
name text
subcatfrom int
它包含一些類別及其子類別的行。我想「選擇」 SQL命令爲每根類別取後,分類和分組及其子類別如下例如:
-cat1
--subcat1
--subcat2
-cat2
--subcat1
--subcat2
這可能嗎?
這是很容易的,但這種結構
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)
原始問題需要分開的行上的子類別。這裏有一種方法:
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.你只有一個父母子女關係的級別。即子類別不能有進一步的子類別 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;
Oracle中這是CONNECT BY – Randy
http://stackoverflow.com/questions/7631048/connect-通過事先等效爲mysql – Vikdor
[MySql不支持遞歸查詢](http://stackoverflow.com/a/7631222/572644) –