* サブクエリ [#x1e258b6]
* 複雑なSQL3 サブクエリ [#x1e258b6]

** 前提 [#te3629a1]
カテゴリは上位のカテゴリとサブカテゴリが存在する。例えば、カテゴリには国語、数学、社会、理科、英語があり、理科カテゴリのサブカテゴリとして物理、化学、地学、生物があるような。カテゴリは2段階までで、サブサブカテゴリは存在しないとする。

** categoryテーブル [#y519d72b]
以下のようなカラムを持つ。category_idとparent_category_idが等しい場合、それは上位のカテゴリである。
- category_id (int)(PK)
- category_name (text)
- parent_category_id (int)

** 取得したいデータ [#me7535cc]
以上の条件で、あるカテゴリ(ここではカテゴリID20)と同じペアレントIDを持つカテゴリをすべて取得する。

例:
,カテゴリID,カテゴリ名
,20,物理
,21,化学
,22,地学
,23,生物

** SQL [#a3f12f4d]
SQLは以下の通り。
 select category_id, category_name 
 from category 
 where 
   parent_category_id = 
   (select parent_category_id from category 
    where category_id = 20);
 order by category_id

** DBIC [#zc4bacb4]
DBICのコードは以下の通り。
 my $subq = sprintf " = (select parent_category_id from category where category_id = %d)",
            20;
 $c_rs = $c_rs->search({
     parent_category_id =>  ?$subq 
 });
 $c_rs = $c_rs->search_literal(
     'category_id <> parent_category_id',
     {order_by => 'category_id'});

** ポイント [#f643a0bb]
- サブクエリ部分は別に変数に代入し、リファレンスを渡す。

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS