如何在SQL查询中为父项加入类别表?

时间:2011-12-17 02:38:04

标签: mysql sql database join

我有一个帖子表(id,category_id,...),然后是JOIN,类别表为(category_id,category_name,parent,...)ON category_id。 Parent是另一个类别的category_id。例如:

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引擎。

2 个答案:

答案 0 :(得分:2)

只需为额外元素执行额外的连接,但将IT作为LEFT连接,因为并非所有类别都具有父类别,并且您不想排除这些类别。

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 :(得分:1)

如果您愿意限制深度,可以使用UNION叠加JOIN来获得您想要的内容。这是一个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个占位符传递(对于您感兴趣的类别)相同的变量。