Извлечение записей с минимальным количеством связанных записей - PullRequest
1 голос
/ 26 октября 2010

Между Собственностью и Резервированием существует отношение один-два-много. Свойство имеет столбец с именем 'nr_of_bookings'. Мне нужен DQL, который будет получать только те свойства, в которых COUNT (Reservation) меньше, чем Property.nr_of_bookins.

Пример: у некоторого свойства nr_of_bookings = 3. Если у него 5 связанных бронирований, он не будет восстановлен. Но если у него есть 2 связанных бронирования, оно будет восстановлено.

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

1 Ответ

1 голос
/ 26 октября 2010

Вы пробовали:

'SELECT p FROM Product p WHERE SIZE(p.reservations) < p.nr_of_bookings'

РЕДАКТИРОВАТЬ: выше для Doctrine 2. Для Doctrine 1.2, глядя на ваш код, я предполагаю, что ваше предложение HAVING ссылается на что-то, что не входит в группу или результат агрегатной функции. Попробуйте что-то вроде этого:

$q = PropertyTable::getInstance()
    ->createQuery('p') 
    ->select('p.*, COUNT(r.id) as num_of_reservations, SUM(p.nr_of_bookings) as num_bookings') 
    ->leftJoin('p.Reservation r') 
    ->groupBy('p.id') 
    ->having('num_of_reservations < num_bookings');

Вы группируете по p.id, поэтому SUM(p.nr_of_bookings) будет равно p.nr_bookings.

Из документации MySQL:

Стандарт SQL не позволяет предложению HAVING именовать столбцы, не найденные в предложении GROUP BY, если они не включены в агрегатную функцию.

...