2011-12-17 6 views
0

投稿のテーブルが(id、category_id、...)の場合、JOIN(category_id、category_name、parent、...)のカテゴリテーブルを使用しています。category_id。親は別のカテゴリのcategory_idです。たとえば:SQLクエリで親のカテゴリテーブルを結合するにはどうすればいいですか?

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

I JOIN投稿やカテゴリテーブルは、あまりにもポストの親カテゴリを読み取ることができますか。例えば、CATEGORY_ID ONシンプルJOIN

id  category_id post_title 
44  4    something 

、私は、カテゴリとしてだけでPHPを得ることができます。私はどうすれば親をComputer Science > Web Technology > PHPとしてもらえますか?

メモ:私はMyISAMエンジンでmysqlを使用します。

+0

いくつかの例が既にStackに存在しています。http://stackoverflow.com/questions/5689635その長短は、mySQLは階層クエリをサポートしていないため、何かを書く必要があります。 Oracleでは、事前に接続して使用します。 SQLサーバーDB2の使用http://stackoverflow.com/questions/959804(with) – xQbert

+0

これは挑戦的な問題のようです。私は逃した簡単な方法があると思った。 – Googlebot

+0

悲しいことに、 mysqlにはありません。レベル数が最大の場合は、左(自己)結合を追加するのが最も簡単です。その最初のリンクは、いくつかの共通の解決策を示す他の回答にリンクしています。 – xQbert

答えて

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

深さを制限する場合は、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つのプレースホルダ(カテゴリのあなたが興味を持っている)に同じ変数を渡します。

関連する問題