2012-02-23 5 views
0

アイデア?誰もこれに前に取り組んだ?事前に複数の結合とサブクエリを使用してこのSQLクエリをPerl DBIx :: Classに変換するにはどうすればよいですか?

select c.parent_id, c.category_id, c.name, count(*) 
    from categories c 
    join product_categories pc 
    on c.category_id  = pc.category_id 
    join authorizations a 
    on pc.product_id  = a.product_id 
    join set_authorizations sa 
    on a.authorization_id = sa.authorization_id 
where a.active   = 1 
    and sa.set_id   = 2 
    and c.parent_id in (
    select category_id 
     from categories 
    where parent_id is null 
     ) 
group by c.parent_id, c.category_id, c.name;

おかげで...

+1

テーブルと外部キーのDBIx :: Class定義は既にありますか? – dgw

答えて

2

あなたが非常に容易に達成されていない何かを探しています。 dgwが正しく述べているように、DBIx :: Class、Rose :: DB :: Object、または好きなORMを使って、モデルオブジェクトを定義して、いくつかの宿題を最初に作る必要があります。これらのオブジェクトを扱うのは、それらがどれほど複雑であっても、些細な作業になります。

しかし、別の方法があります:SQL :: Abstractモジュールとその 'extension'を使用して、SQL :: Abstract :: More。クエリを抽象化する必要がある場合は、「sqlish」ではなく「perlish」にしてください。それは医師が注文したものだと思います。例えば)

、SQLでクエリ::抽象は::その他のそのような音になります。おそらく、作成するすべての結合テーブルとビューを作成...しかし、まだかなり手ごわいです

my ($sql, @bind) = $sqla->select(
    -columns => [ qw/c.parent_id c.category_id c.name COUNT(*)/ ], 
    -from => [-join => qw/ 
     categories|c 
      category_id=category_id product_categories|pc 
      product_id=product_id  authorizations|a 
      authorization_id=authorization_id set_authorizations|sa 
     /], 
    -where => { 
    'a.active' => 1, 
    'sa.set_id' => 2, 
    'c.parent_id' => \["IN (SELECT category_id FROM categories WHERE parent_id IS NULL)"], 
    }, 
    -group_by => [qw/ c.parent_id c.category_id c.name /], 
); 

コード(と、私は、パフォーマンスと思われる)より消化? )

関連する問題