Использование порядка по количеству в левых объединенных таблицах

У меня проблема с сортировкой результатов запроса по полю количества. Мой упрощенный запрос:

$customers = Doctrine_Core::getTable("Customer")->createQuery("c")
    ->leftJoin("c.Project p")
    ->orderBy("COUNT(p.id) ASC");
    ->execute();

Я почти уверен, что проблема не связана с доктриной. Сгенерированный ORM-запрос, полученный из журналов приложений, выбирает только одну строку и содержит строку:

ORDER BY COUNT( r2.id ) ASC

После удаления которого все строки выбираются правильно.

Предложение ORDER BY заставляет запрос выбирать только одну строку из таблицы клиентов. Я думаю, это как-то связано с тем, что у клиентов нет назначенных им проектов. Что я делаю неправильно?


person Przemek    schedule 12.03.2012    source источник
comment
Можете ли вы добавить остальную часть запроса, сгенерированного ORM, к вопросу? Упорядочение по агрегированному значению — это то, что можно сделать только для сгруппированных запросов. Если вы хотите упорядочить по p.id (а не по количеству p.id), вам следует изменить свой запрос на ORDER BY r2.id ASC.   -  person    schedule 12.03.2012
comment
Нет, я хочу, чтобы он был упорядочен по количеству связанных строк.   -  person Przemek    schedule 12.03.2012
comment
Означает ли «нет», что вы не можете добавить остальную часть запроса, сгенерированного ORM, к вопросу?   -  person    schedule 12.03.2012
comment
Нет-нет, речь шла об упорядочении по идентификаторам. Я приложу остальную часть запроса позже, потому что сейчас у меня нет доступа к приложению.   -  person Przemek    schedule 12.03.2012
comment
Кроме того, это MySQL? (Я подозреваю, что эта форма запроса потерпит неудачу в большинстве других СУБД.)   -  person    schedule 12.03.2012


Ответы (1)


Если вы пытаетесь сгруппировать по количеству проектов для Заказчика, попробуйте использовать предложение GROUP BY и агрегировать по первичному ключу Заказчика:

$customers = Doctrine_Core::getTable("Customer")->createQuery("c")
->select('c.*, count(p.id) as count')
->leftJoin("c.Project p")
->groupBy('c.id') // or the primary key of Customer
->orderBy("count ASC")
->execute();
person dbellizzi    schedule 30.03.2012