2016-05-29 15 views
1

タイトルが質問に一致しない場合は、まず謝ります。さて、問題はこのクエリを構築する方法です...クエリ内のMysqlクエリ

私はcategoryというテーブルがあります。それは私のもの(映画)のカテゴリが含まれています。これはこのようなものです...

-------------------------------- 
ID | name | parent_category 
-------------------------------- 
1 | love | 0 
2 | action | 0 
3 | fear | 0 
4 | passion| 1 
5 | danger | 2 
6 | death | 3 
-------------------------------- 

このように、各カテゴリには親カテゴリがあります。最初の3人を除いて。彼らは両親です。

や映画テーブルだから...このよう

-------------------------------- 
ID | name | category 
-------------------------------- 
1 | aaaa | 1 
2 | bbbbbb | 2 
3 | cccc | 2 
4 | ddddddd| 1 
5 | eeeeee | 3 
6 | fffff | 3 
-------------------------------- 

で、私は何をしたい親カテゴリで映画を選択すること、です。つまり、カテゴリloveをクリックすると、親カテゴリとしてloveのカテゴリのすべての動画を選択する必要があります。

これを1回のクエリで書く方法は?

+1

'選択*カテゴリは= 1 '...それは愛のカテゴリに階層の –

+1

どのように多くのレベルをすべてのムービーを表示します映画からは、そこにすることができますか? – sagi

+0

実際、ムービーテーブルでは、ムービーは常に子カテゴリーで保存されます。 – TharinduLucky

答えて

1

両親が唯一のレベルの深さであれば、あなたはjoin秒使用することができます:あなたが唯一のidをしたい場合は、次の2つを必要としない、実際に

select m.*, 
     coalesce(cp.id, c.id) as parent_id, 
     coalesce(cp.name, c.name) as parent_name 
from movies m left join 
    categories c 
    on m.category = c.id left join 
    categories cp 
    on c.parent_category = cp.id; 

は加入:

select m.*, 
     (case when c.parent_id > 0 then c.parent_id else c.id end) as parent_id 
from movies m left join 
    categories c 
    on m.category = c.id ; 

あるいは、もっと単純に:secend tに条件によってフィルタリングされた行を選択するための

select m.*, greatest(c.parent_id, c.id) as parent_id 
. . . 
+0

ありがとう!これは少し進んだもののようです。とにかく私は試してみる。 :) – TharinduLucky

+0

答えでは、mは何を意味しますか? – TharinduLucky

+1

'm'はテーブルエイリアスです。これは、 'from'節のテーブルまたはサブクエリの省略形です。場合によっては、クエリーを作成したり読むのに便利です。それ以外の場合( 'left join'sの場合)は必須です。 –

1

INまたはEXISTS関数の条件でFROM句またはサブクエリで結合を使用できます。フィールドをある文字列と比較するには、LIKE演算子を使用できます。

1

あなたはparent_categoryに基づいてフィルタリングしている場合 -

SELECT b.*, a.name FROM movies b 
    LEFT JOIN categories a ON a.id = b.category 
WHERE a.parent_category = 1;