2017-07-30 25 views
0

product_idに基づいてすべてのparent_id名を取得して表示しようとしています。私がやっているのは、特定の製品にカテゴリを追加できる管理ページを作成することですが、最初にparent_idに関連付けられているカテゴリテーブルの各名前を追加/編集できるようにする必要があります。私はPRODUCT_ID 99を照会するときSQLカテゴリ - すべてのparent_id名を取得できません

だから、私は戻って取得する必要がありますスケートボード - > action_sports - >スポーツ

Categories Table 
---------------------------------- 
| id |  name  | parent_id | 
---------------------------------- 
| 1 | sports  | null | 
---------------------------------- 
| 2 | action_sports |  1  | 
---------------------------------- 
| 3 | skateboarding |  2  | 
---------------------------------- 


Product Category Joiner Table 
---------------------------- 
| product_id | category_id | 
---------------------------- 
|  99  |  3  | 
---------------------------- 

私は考えることができる唯一のことは、テーブルを結合することです。異なるIDで同じテーブルに2回参加できることを期待していましたが、明らかにうまくいきません。

SELECT categories.name, categories.parent_id FROM products 
INNER JOIN product_category ON products.id = product_category.product_id 
INNER JOIN categories ON categories.id = product_category.category_id 
WHERE products.id = 99 

returns: 

----------------------------- 
|  name  | parent_id | 
----------------------------- 
| skateboarding |  2  | <-- need to get name of each parent_id above 
----------------------------- 

うまくいけば、ちょっと意味が分かりました。

答えて

0

parent_id nullに到達するレベルがいくつあるかわからない場合は、これを解決するために再帰的なcteを使用できます。

with recursive cte as 
    (select p.id as product_id, 
      c.name, 
      c.parent_id 
    from products p 
    join product_category pc on p.id = pc.product_id 
    join categories c on c.id = pc.category_id 
    union all 
    select p.id, 
      c.name, 
      c.parent_id 
    from cte r 
    join products p on p.id = r.product_id 
    join categories c on c.id = r.parent_id 
) 
select * 
from cte 
where product_id=99 --change this to the desired product_id 
1

あなたがたが最初のカテゴリにだけ必要とされているもので、再帰CTEを使用することができます。

with recursive cte as (
     select c.id, c.name, c.parent_id 
     from products p join 
      categories c 
      on c.id = p.category_id 
     where p.product_id = 99 
     union all 
     select c.id, c.name, p.parent_id 
     from cte join 
      products p 
      on cte.parent = c.id 
    ) 
select * 
from cte; 
関連する問題