zend findManyToManyRowset выбрать группу - PullRequest
1 голос
/ 19 марта 2012

Мне нужно найти findManyToManyRowset с упорядочением по и сгруппировать по выборкам для таблицы пересечений.

SQL для подвыбора пересечения выглядит следующим образом:

$order = "select *
from intersection
order by someCol desc";

$group = "select order.*
from ($order) as order
group by order.otherCol";

Строка подвыбора результата - $ group.

5-й параметр $ select для findManyToManyRowset должен иметь значение Zend_Db_Table_Select, но я застрял в этой точке, потому что я не могу сделать истинный суб-выбор с Zend_Db_Table_Select и потому что в findManyToManyRowset (..) есть строки

if ($select === null) {
    $select = $matchTable->select();
} else {
    $select->setTable($matchTable);
}

    $select->from(array('i' => $interName), array(), $interSchema)
           ->joinInner(array('m' `enter code here`=> $matchName), $joinCond, Zend_Db_Select::SQL_WILDCARD, $matchSchema)
           ->setIntegrityCheck(false);

и они ломают все, что я делаю в $ select ($ group)

1 Ответ

0 голосов
/ 20 марта 2012

проблема решена.

Я изменил бы строку SQL таким образом

на

select
*
from someTable st1
where groupCol =
    (
    select
        max(st2.groupCol)
    from someTable st2
    where
        st1.firstId=st2.firstId
        and st1.secondId=st2.secondId
        ....
        and etc
    )
--and groupResult=1;

, поэтому у меня тот же результат без подвыборазаказывать и без присоединения.

Зенд-код:

    $matchTable,$intersectionTable - should be instance of Zend_Db_Table_Abstract with correct reference map

        $max = $intersectionTable->select()
                ->from(array('mx' => 'intersectionTableName'), new Zend_Db_Expr("max(mx.groupCol)"))
                ->where('i.firstId = mx.firstId')
                ->where('i.secondId = mx.secondId')
                ...
                -> etc ;


        $select = $matchTable->select()
//                  ->where('i.groupResult = ?', true) optional, in case we would like to filter result rowset by grouped value
                    ->where('i.groupCol = ?', $max);



        $result = $row->findManyToManyRowset($matchTable, $intersectionTable, null, null, $select);
...