Mysql (доктрина) дублирует результаты подсчета, вероятно, из-за группировки, но не может понять это - PullRequest
0 голосов
/ 24 апреля 2018

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

У меня есть таблица счетов-фактур, таблицы invoice_items и invoice_payments, и в результате я хотел бы получить все счета, которые еще не оплачены или, по крайней мере, еще не полностью оплачены. Я знаю, что запрос должен быть почти корректным, потому что он возвращает правильное количество элементов ... единственное, что он умножает количество на количество вероятно соединенных строк.

Итак, запрос, который у меня есть сейчас:

select  invoice.*, sum(item.amount * item.quantity) as totalDue, 
        sum(payment.amount) as totalPaid 
from invoices as invoice 
    left join invoice_items as item on item.invoice_id = invoice.id 
    left join invoice_payments as payment on payment.invoice_id = invoice.id 
        and payment.status = 'successful' 
where invoice.invoice_number is not null 
and invoice.sent_at is not null 
and invoice.due_date >= '2018-05-15' 
group by invoice.id 
having count(payment.id) = 0 
    or sum(payment.amount) < sum(item.amount * item.quantity) 
order by invoice.issue_date desc, sum(payment.amount) desc;

Как вы видите, у меня также есть totalDue и totalPaid в моем выборе (они только для справки и должны быть удалены, если запрос правильный).

Что я увидел, так это то, что сумма умножается на шесть (потому что в таблице платежей есть 6 пунктов).

Так что, возможно, кто-то может помочь мне указать в правильном направлении, что он не выполняет умножение на totalDue. Я думал, что это, вероятно, потому что группа, но без моего запроса терпит неудачу.

1 Ответ

0 голосов
/ 24 апреля 2018

Просто используя отличительный в моем запросе, я исправил проблему.

select invoice.*, sum(distinct(item.amount * item.quantity)) as totalDue, 
        sum(payment.amount) as totalPaid 
from invoices as invoice 
    left join invoice_items as item on item.invoice_id = invoice.id 
    left join invoice_payments as payment on payment.invoice_id = invoice.id 
        and payment.status = 'successful' 
where invoice.invoice_number is not null 
and invoice.sent_at is not null 
and invoice.due_date >= '2018-05-15' 
group by invoice.id 
having count(payment.id) = 0 
    or sum(payment.amount) < sum(distinct(item.amount * item.quantity)) 
order by invoice.issue_date desc, sum(payment.amount) desc;

Я хотел бы поблагодарить всех людей, которые нашли время, чтобы изменить мой вопрос; -)

...