У меня есть настройка запроса 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 моделей.
Где я ошибаюсь?