Как я могу преобразовать этот SQL-запрос, используя несколько соединений и подзапросов в Perl DBIx :: Class? - PullRequest
1 голос
/ 23 февраля 2012

Есть идеи? Кто-нибудь занимался этим раньше?

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 Ответ

2 голосов
/ 24 февраля 2012

Вы ищете что-то, что не совсем легко сделать. Как правильно сказал dgw, вы должны сначала сделать домашнее задание, определив объекты вашей модели - с помощью DBIx :: Class или Rose :: DB :: Object или любого другого ORM, который вы предпочитаете. Только тогда работа с этими объектами станет тривиальной задачей, независимо от того, насколько они сложны.

Но есть и другой способ: использовать модуль SQL :: Abstract и его «расширение», SQL :: Abstract :: More. Если вам нужно только абстрагировать ваши запросы, сделать их «perlish» вместо «sqlish», я полагаю, это именно то, что доктор прописал. )

Например, ваш запрос в SQL :: Abstract :: More будет звучать так:

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 со всеми объединенными таблицами сделает код (и, я полагаю, производительность) более удобочитаемым? )

...