2012-02-23 41 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 2012-02-23 18:44:33

回答

2

你要找的東西,是不是很容易實現的。正如dgw所說的,你必須首先做一些家庭作業,定義你的模型對象 - 用DBIx :: Class或者Rose :: DB :: Object,或者你喜歡的任何ORM。只有這樣,使用這些對象才能成爲一項簡單的任務,無論它們有多複雜。

但還有另一種方法:使用SQL :: Abstract模塊及其「擴展」,SQL :: Abstract :: More。如果你只需要抽象你的查詢,使他們'完美'而不是'sqlish',我想這正是醫生的命令。 )

例如,在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 /], 
); 

這仍然相當艱鉅,但...也許創造了所有的連接表將使VIEW代碼(和,我想,性能)更容易消化? )

相關問題