2011-12-17 25 views
0

我有一個表作爲(id,category_id,...),然後JOIN與類別表作爲(category_id,category_name,parent,...)ON category_id。父母是另一類別的category_id。例如:如何在SQL查詢中爲父項加入類別表?

category_id category_name  parent 
1    Computer Science NULL 
2    Web Technology  1 
3    Mathematics  NULL 
4    PHP    2 

我如何JOIN職位和類別表讀取後的父類了。例如,

id  category_id post_title 
44  4    something 

通過簡單JOIN ON CATEGORY_ID,我只能得到PHP作爲類;我怎麼能像Computer Science > Web Technology > PHP那樣得到父母?

注意:我使用mysql和MyISAM引擎。

+0

幾個例子已經存在堆棧:http://stackoverflow.com/questions/5689635命名一個。它的長短之處在於mySQL不支持分層查詢,所以你必須寫一些東西。在Oracle中,他們使用之前的連接方式。 SQL服務器DB2使用http://stackoverflow.com/questions/959804(帶) – xQbert 2011-12-17 02:40:42

回答

2

只需爲額外的元素執行額外的連接,但將IT作爲左連接,因爲並非所有類別都具有父類別,並且您不希望排除這些元素。

select 
     P.ID, 
     P.Post_Title, 
     P.Category_ID, 
     C.Category_Name as FirstCat, 
     C.Parent, 
     COALESCE(C2.Category_Name, ' ') as ParentCategory 
    from 
     Posts P 
     JOIN Categories C 
      on P.Category_ID = C.Category_ID 
      LEFT JOIN Categories C2 
       on C.Parent = C2.Category_ID 
    where 
     AnyFiltering 
1

如果你願意限制深度,你可以使用UNION堆積JOINs得到你想要的。這裏有一個3級深度實施:

select * from posts 
where category_id = ? 
union 
select * from posts p 
join category c on c.category_id = p.category_id 
where c.parent = ? 
union 
select * from posts p 
join category c1 on c1.category_id = p.category_id 
join category c2 on c2.category_id = c1.parent 
where c2.parent = ? 

您將通過相同的變量中(對您感興趣的類別)的所有3個佔位符。