[Moscow.pm] DBIx и свертка в массивы

Oleg Kostyuk cub.uanic на gmail.com
Чт Авг 18 04:26:11 PDT 2011


Да, конечно читаю.

На мой взляд, позор в том, что вы спрашиваете и при этом всё-таки НЕ
читаете документацию. Если бы вы читали, то у вас бы не было вопроса,
"а как сделать GROUP BY". Ещё позор в том, что вы либо не читаете, что
вам пишут, либо игнорите, либо и то, и другое. Если бы читали и не
игнорили - написали бы DBIC вместо DBIx. Или это от черезмерного ЧСВ?
- "типа, я круче всех, я знаю как писАть правильно, я так привык,
нефиг мне указывать!"

Другое дело, что вы не смогли чётко сформулировать свой вопрос, потому
как у вас нет четкого понимания того, как работает база, что она
может, а что нет. И потому вы решили, что вам нужно решение с GROUP
BY. Но здесь это не подойдет, потому как по указанным в GROUP BY
столбцам происходит группировка, а к не указанным нужно ОБЯЗАТЕЛЬНО
применять аггругирующие функции. Увы, но в классическом SQL нет такой
аггрегирующей функции, чтоб из нескольких значений сделать одно, с
типом "множество" и включающим все аггрегируемые данные. Потому
решение в данном случае, как и предлагал Руслан, будет опираться на
perl'овую сторону сильнее, чем на SQL'ную.

Примерно, вот так (не тестировал):

my %result = map {
    $_->some => [
        $rs->search(
            {some => $_->some},
            {
                order_by => [qw/ id /],
                columns => [qw/ id /],
            }
        )->get_column('id')->all
    ]
} $rs->search(
    undef,
    {
        columns => [qw/ some /],
        distinct => 1,
    }
)->all;

$rs - это ваш resultset, по которому вы хотели делать группировку.

Решение как вы и хотели - исключительно в терминах DBIC, и потому
неоптимально: для каждого уникального значения в some будет сделан
отдельный запрос в базу. Вполе возможно, что на ваших данных будет
быстрее сделать один запрос в базу, и разобрать результат на стороне
perl'а. Намёк для такого решения: используйте преобразование Шварца
(http://en.wikipedia.org/wiki/Schwartzian_transform). Само решение -
на домашнее упражнение.

Удачи.



18 августа 2011 г. 6:30 пользователь Ivan Petrov
<i.petro.77.00 на gmail.com> написал:
>> Скажите, вы читаете ответы вам в рассылке? А то есть сомнения.
>
>> А документацию вы тоже не читаете?.. Ну хотя бы FAQ... или Cookbook...
>> Ну хоть что-нибудь?...
>
>> http://www.google.com/search?ie=UTF-8&oe=utf-8&q=cpan+dbix%3A%3Aclass+group+by
>> Первые две ссылки (DBIx::Class::ResultSet и
>> DBIx::Class::Manual::Cookbook) - ваши.
>> Прочитайте и не позорьтесь больше.
>
> расскажите плиз в чем позор?
>
> вот соседний с Вами ответ предлагает делать свертку perl'овым кодом.
> то есть не использовать возможности БД, заменяя их на свой код. Это
> какой-никакой но ответ на поставленный вопрос.
>
> вы предлагаете читать ссылки, которые я уже прочитал прежде чем
> написать сюда письмо. и которые не содержат ответа на поставленный
> вопрос.
>
> Скажите, а вы читаете вопросы на которые отвечаете?
>
>> 16 августа 2011 г. 10:36 пользователь Ivan Petrov
>> <i.petro.77.00 на gmail.com> написал:
>>> некоторые БД умеют сворачивать в массивы значения столбиков если
>>> делается GROUP BY.
>>>
>>> вопрос можно ли аналогичный запрос составить через DBIx?
>>>
>>> то есть например таблица
>>>
>>> (id, some)
>>>
>>> надо сделать GROUP BY по some и получить в каждой выборке в поле some
>>> массив id.
>>>
>>> как?
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>



-- 
Sincerely yours,
Oleg Kostyuk (CUB-UANIC)


Подробная информация о списке рассылки Moscow-pm