Doctrine_Pager возвращает неверные результаты с несколькими столбцами groupBy - PullRequest
1 голос
/ 28 ноября 2010

У меня есть настройка запроса Doctrine с mySQL в качестве базы данных:

  $q = Doctrine_Query::create();
    $q->select('make.id, make.make, 
    model.id, model.year, model.model')
      ->from('Make make')
      ->innerJoin('make.Models model');     
    $q->groupBy('make.id, model.id');    // <-- this is where the problem
    $q->orderBy('make ASC');
    $q->setHydrationMode(Doctrine_Core::HYDRATE_SCALAR);
    $pager = new Doctrine_Pager($q, 1, 1);  // just want one result to prove the concept
    $items = $pager->execute();

Это выполняет три этих запроса (из журнала mysql):

SELECT COUNT(*) AS num_results ОТ (ВЫБРАТЬ m. id ОТ make m ВНУТРЕННЕЕ СОЕДИНЕНИЕ model m2 ВКЛ m. id = m2. make_id GROUP BYm. id, m2. id) dctrn_count_query

ВЫБРАТЬ ОТЛИЧИЕ m3. id ОТ make m3 ВНУТР. СОЕДИНЕНИЕ model m4 ВКЛm3. id = m4. make_id GROUP BY m3. id, m4. id ЗАКАЗАТЬ НА m3. make ASC LIMIT 1

SELECT m. id AS m__id, m. make AS m__make, m2. id AS m2__id, m2. year AS m2__year, m2. model AS m2__model ОТ make m ВНУТР. СОЕДИНЕНИЕ model m2 ВКЛ m. id = m2. make_id ГДЕ m. id В('33') GROUP BY m. id, m2. id ORDER BY m. make ASC

И набор результатов равен

    array
        0 => 
            array
              'make_id' => string '33' (length=2)
              'make_make' => string 'Alfa-romeo' (length=10)
              'model_id' => string '288' (length=3)
              'model_year' => string '2010' (length=4)
              'model_model' => string '159' (length=3)
        1 => 
            array
              'make_id' => string '33' (length=2)
              'make_make' => string 'Alfa-romeo' (length=10)
              'model_id' => string '289' (length=3)
              'model_year' => string '2010' (length=4)
              'model_model' => string 'MiTo' (length=4)
        2 => 
            array
              'make_id' => string '33' (length=2)
              'make_make' => string 'Alfa-romeo' (length=10)
              'model_id' => string '290' (length=3)
              'model_year' => string '2010' (length=4)
              'model_model' => string '159 SPORTWAGON' (length=14)

Проблема со вторым запросом, который возвращает make.id, который используется в третьем запросе для выбора 1 мake (Alfa-Romeo, у которого есть 3 модели).Я хочу вернуть NUMBER OF комбинаций «марка / модель».

Если я изменю количество элементов, возвращаемых в Doctrine_Pager, на 2, я получу 33 строки (потому что из двух выбранных марок Alfa-Romeo имеет 3 модели и Audi (что дальше) имеет 30 моделей.

Где я ошибаюсь?

Ответы [ 2 ]

1 голос
/ 11 октября 2013

Нельзя объединить несколько столбцов в одну группу. Попробуйте это ...

$q->groupBy('make.id');
$q->addGroupBy('model.id');

или чуть более сжатый ...

$q->groupBy('make.id')->addGroupBy('model.id');
0 голосов
/ 10 сентября 2011
...