Вопрос или проблема
Согласно базе данных членства нашего клуба, некоторые члены имеют задолженности. Есть 5 столбцов: id, номер_члена, объект, дебет и кредит. Поскольку взносы могут быть отсрочены, может быть несколько строк дебета или кредита для одного члена. Поэтому, чтобы выяснить, сколько членов имеет задолженности, я должен посчитать тех, у кого общий дебет превышает общий кредит.
Что-то вроде этого:
->select( COUNT(id) )
->where ( SUM(debits) > SUM(credits) )
->getQuery()
->getSingleScalarResult();
Конечно, я не могу использовать агрегатные функции в условии WHERE.
Я думал использовать HAVING и GROUP BY, но поскольку мне нужно посчитать и получить единственный результат, а не массив, это не сработает. Есть идеи, как это сделать с помощью DQL?
Ответ или решение
Для решения вашей задачи с использованием DQL (Doctrine Query Language) для определения количества членов клуба, которые находятся в задолженности, так как их общий дебет превышает общий кредит, вам действительно нужно воспользоваться группировкой и условием HAVING. При этом вы можете использовать подзапрос или дополнительные вычисления для подсчета нужного значения, что позволит получить одно скалярное значение.
Вот как вы можете сформулировать ваш запрос:
SELECT COUNT(m.id)
FROM Membership m
GROUP BY m.member_nbr
HAVING SUM(m.debit) > SUM(m.credit)
Но поскольку вы хотите получить единичный результат (число членов в задолженности), мы можем обернуть этот запрос в другой запрос. В DQL это можно сделать с помощью подзапроса. Пример:
SELECT COUNT(*)
FROM (
SELECT m.member_nbr
FROM Membership m
GROUP BY m.member_nbr
HAVING SUM(m.debit) > SUM(m.credit)
) AS subquery
Объяснение:
-
SUBQUERY: Внутренний запрос группирует записи по
member_nbr
и вычисляет суммы дляdebit
иcredit
. УсловиеHAVING
используется для фильтрации, тем самым оставляя только тех членов, у которых сумма дебетов превышает сумму кредитов. -
*COUNT()**: Внешний запрос подсчитывает количество уникальных членов, которые подходят под рабочие критерии.
Убедитесь, что в вашей модели Membership
правильно настроены отношения и атрибуты, чтобы запрос выполнялся корректно. После этого вы можете выполнить этот DQL запрос с использованием вашего менеджера сущностей для получения результата.
Если у вас остались вопросы или есть необходимость в доработке запроса, не стесняйтесь задавать.