複雑なSQL2 再帰的なデータ構造再帰的なデータ構造のテーブルに対し、自己結合を使ってデータを取得する。 前提カテゴリは上位のカテゴリとサブカテゴリが存在する。例えば、カテゴリには国語、数学、社会、理科、英語があり、理科カテゴリのサブカテゴリとして物理、化学、地学、生物があるような。カテゴリは2段階までで、サブサブカテゴリは存在しないとする。 categoryテーブル以下のようなカラムを持つ。category_idとparent_category_idが等しい場合、それは上位のカテゴリである。
取得したいデータ以上の条件で、すべてのカテゴリIDとそのペアレントID、およびそれぞれのカテゴリ名を取得したい。 例:
SQLSQLは以下の通り。 select cate1.category_id as cate_id, cate1.category_name as cate_name, cate1.parent_category_id as p_cate_id, cate2.category_name as p_cate_name from category cate1 join category cate2 on cate1.parent_category_id = cate2.category_id where cate1.category_id <> cate1.parent_category_id order by cate1.parent_category_id, cate1.category_id; DBICDBICのコードは以下の通り。 $c_rs = $c_rs->search_literal( 'cate1.category_id <> cate1.parent_category_id' , { from => [ {cate1 => 'category'}, [ {cate2 => 'category'}, {'cate1.parent_category_id' => 'cate2.category_id'} ], ], select => [ 'cate1.category_id', 'cate1.category_name', 'cate1.parent_category_id', 'cate2.category_name', ], as => [qw/ category_id category_name parent_category_id parent_category_name /], order_by => [qw/ cate1.parent_category_id cate1.category_id /] } ); ポイント
|
|