- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- Perl-DBIC/SELECT 基本 へ行く。
- 1 (2007-05-02 (水) 03:52:20)
- 2 (2007-09-04 (火) 01:45:48)
- 3 (2007-12-11 (火) 02:17:23)
- 4 (2008-04-08 (火) 03:53:28)
- 5 (2008-04-16 (水) 13:55:33)
- 6 (2008-04-22 (火) 19:47:29)
- 7 (2008-04-24 (木) 17:30:24)
- 8 (2008-05-26 (月) 05:55:13)
- 9 (2008-06-13 (金) 06:02:45)
- 10 (2008-06-16 (月) 03:00:36)
- 11 (2008-09-05 (金) 09:34:34)
- 12 (2008-10-23 (木) 09:52:45)
- 13 (2009-07-09 (木) 11:46:42)
- 14 (2009-11-14 (土) 07:35:54)
- 15 (2009-11-20 (金) 12:39:06)
- 16 (2009-12-16 (水) 07:56:55)
- 17 (2010-02-16 (火) 16:24:27)
- 18 (2010-04-09 (金) 14:47:04)
- 19 (2010-05-17 (月) 06:11:30)
- 20 (2010-05-18 (火) 16:55:53)
- 21 (2010-06-07 (月) 05:50:36)
- 22 (2011-02-28 (月) 02:23:37)
- 23 (2011-05-17 (火) 12:04:15)
- 24 (2011-06-16 (木) 11:21:18)
- 25 (2011-06-30 (木) 01:38:33)
- 26 (2011-11-09 (水) 06:59:28)
SELECT
where句を設定する
$rs->search({ age => 20 }) # WHERE age = 20 = $rs->search({ age => {'>' => 20} }) # WHERE age > 20 > $rs->search({ age => undef }) # WHERE age is NULL NULL $rs->search([{ age => 20 },{ age => 30 }]) # WHERE age = 20 OR age = 30 OR $rs->search({ age => 20, name => 'taro }) # WHERE age = 20 AND name = 'taro' AND $rs->search({ 'age' => { '>' => 10, '<' => 20 }}) # WHERE age > 10 AND age < 20 AND 同じカラムを使う場合 $rs->search_like({ name => '%taro%' }) # WHERE name LIKE '%taro%' LIKE $rs->search({id => {-in => \@ids}}) # WHERE id in (1,2,3..) IN
http://search.cpan.org/perldoc?DBIx::Class::ResultSet#search
結果を取り出す
順次取り出す
my $rs = $schema->resultset('User')->search({ age => 20}); while (my $user = $rs->next) { }
1行だけ取り出す
my $user = $schema->resultset('User')->single({ age => 20});
最初の行を取り出す
my $user = $schema->resultset('User')->search({ age => 20})->first;
全行取り出す
my @users = $schema->resultset('User')->search({ age => 20})->all;
http://search.cpan.org/perldoc?DBIx::Class::ResultSet
プライマリキーで結果を取り出す
見つからないときは、undefが返ってくる。
my $cd = $schema->resultset('CD')->find(5);
ORDER BY
$rs->search({},{ order_by => [ 'name', { -desc => 'id' } ] # ORDER BY name ASC, id DESC }); # 'name' は { -asc => 'name' } の省略形
http://search.cpan.org/perldoc?SQL::Abstract#ORDER_BY_CLAUSES
GROUP BY
$rs->search({},{ select => ['name', {SUM => 'point'}], as => ['name', 'point'], group_by => ['name'], }); $point = $rs->next->get_column('point');
COUNT()
$rs = $rs->search(); print $rs->count;
↓SELECT COUNT(DISTINCT name) FROM user
$rs = $rs->seach({},{ select => [ { count => { distinct => 'name' } } ], as => ['count'], }); print $rs->next->get_column('count');
LIMIT / OFFSET
$rs->search({},{ order_by => 'id' })->slice(0,20); # slice($offset,$limit)
テーブル結合
JOIN (3つのテーブル)
SELECT order.* FROM order JOIN order_detail ON order.id = order_detail.order_id JOIN goods order_detail.goods_id = goods.id WHERE goods.name = 'book'
$rs->search({ "goods.name" => 'book', },{ join => {order_detail => 'goods'} });
自己結合
SELECT XXX FROM category cate1 JOIN category cate2 ON cate1.parent_category_id = cate2.category_id
$rs = $rs->search({}, { from => [ { cate1 => 'category' }, [ { cate2 => 'category' }, { 'cate1.parent_category_id' => 'cate2.category_id' } ] ] } );
自己結合
SELECT goods.*, cate1.category_name AS category_name, cate2.category_name AS parent_category_name FROM goods JOIN category cate1 ON goods.category_id = cate1.category_id JOIN category AS cate2 ON cate1.parent_category_id = cate2.category_id WHERE goods_id = 123
my $rs = $self->schema->resultset('Goods')->search( { goods_id => 123 }, { '+select' => [ 'cate1.category_name', 'cate2.category_name' ], '+as' => [ 'category_name', 'parent_category_name' ], from => [ { me => 'goods' }, [ { cate1 => 'category' }, { 'me.category_id' => 'cate1.category_id' } ], [ { cate2 => 'category' }, { 'cate2.category_id' => 'cate1.parent_category_id' } ], ] } ); $row = $rs->first; print $row->get_column('category_name');
$row->get_column('category_name')でなく$row->category_nameとしたい場合は、テーブル定義クラスに sub category_name{ shift->get_column('category_name) } というアクセサを追加しておけばよい。
PREFETCH
$rs->search(undef,{prefetch => 'user', join => 'user'});
ジョインするテーブルをjoin=>'TABLE名'で明示する事。
特定のカラムのみSELECT(AS演算子)
$rs->search({},{ select => [ 'name', 'age' ], as => [ 'name', '年齢'], }); print $r->name, $r->get_column('年齢');
DB関数
sum()
# SELECT sum(point) AS total_point FROM t1; $rs = $rs->search( {}, { select => [ { sum => 'point' } ], as => ['total_point'], } ); my $total_point = $rs->first ? $rs->first->get_column('total_point') : 0;
DBの関数を比較の対象に使う
$rs->search({"date_part('year', age(now(), birth_date))" => { '<=' => 18 } }); # 年齢が18歳以下 # date_part()とage()はPostgreSQLの関数
DBの関数を比較の値に使う
不等号「>」も含めて、スカラリファレンスにする。
$rs->search( { start_day => \' > now()' } );