- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- Perl-DBIC/複雑なSQL/複雑なSQL3 サブクエリ へ行く。
- 1 (2007-04-09 (月) 01:48:06)
- 2 (2008-09-05 (金) 09:35:49)
DBIC サブクエリ
前提
カテゴリは上位のカテゴリとサブカテゴリが存在する。例えば、カテゴリには国語、数学、社会、理科、英語があり、理科カテゴリのサブカテゴリとして物理、化学、地学、生物があるような。カテゴリは2段階までで、サブサブカテゴリは存在しないとする。
categoryテーブル
以下のようなカラムを持つ。category_idとparent_category_idが等しい場合、それは上位のカテゴリである。
- category_id (int)(PK)
- category_name (text)
- parent_category_id (int)
取得したいデータ
以上の条件で、あるカテゴリ(ここではカテゴリID20)と同じペアレントIDを持つカテゴリをすべて取得する。
例:
カテゴリID | カテゴリ名 |
20 | 物理 |
21 | 化学 |
22 | 地学 |
23 | 生物 |
SQL
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
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'});
ポイント
- サブクエリ部分は別に変数に代入し、リファレンスを渡す。