2012-02-23 3 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 модуля и его расширение, SQL :: Abstract :: More. Если вам нужно только абстрагировать свои запросы, сделайте их «perlish» вместо «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 со всеми соединенными таблицами сделают код (и, я полагаю, производительность) более удобоваримый?)