У меня есть запрос MySQL с четырьмя операторами IF, которые должны установить псевдоним «1» или «0» в соответствии с условиями внутри. Хотя у меня нет никаких ошибок, единственный IF, возвращающий правильные значения, совпадает с псевдонимом is_paid
.Запрос MySQL с несколькими операторами IF, не возвращающими ожидаемые результаты
Я дважды проверял условия для других трех псевдонимов, и даже если они в порядке, я все равно получаю фиктивные результаты.
Я что-то не так? Есть ли способ написать запрос, чтобы я мог получить ожидаемые результаты?
Вот запрос:
SELECT r.doc_number,
r.doc_date,
r.due_date,
r.currency,
r.amount,
r.vat,
r.vatammount,
(r.amount + r.vatammount) final_amount,
r.currency,
b.boq_id,
b.boq_comp_id,
b.boq_client_id,
b.boq_agency,
b.boq_date,
b.boq_orders,
b.receivable_id,
c.comp_name,
crm.`cn-name-first`,
crm.`cn-name-last`,
bi.inv_path,
(SELECT SUM(amount_recieved) FROM receivables_payments WHERE r_id = b.receivable_id) total_amount_received,
IF (r.amount + r.vatammount = (SELECT SUM(amount_recieved) FROM receivables_payments WHERE r_id = b.receivable_id), '1', '0') AS is_paid,
IF (CURRENT_DATE >= r.due_date AND r.amount + r.vatammount != (SELECT SUM(amount_recieved) FROM receivables_payments WHERE r_id = b.receivable_id), '1', '0') AS is_overdue,
IF (r.due_date < CURRENT_DATE AND r.amount + r.vatammount != (SELECT SUM(amount_recieved) FROM receivables_payments WHERE r_id = b.receivable_id), '1', '0') AS is_outstanding,
IF (r.due_date = CURRENT_DATE AND r.amount + r.vatammount != (SELECT SUM(amount_recieved) FROM receivables_payments WHERE r_id = b.receivable_id), '1', '0') AS is_due_today
FROM receivables r
LEFT JOIN boq b ON b.receivable_id = r.id
LEFT JOIN boq_invoices bi ON bi.inv_boq_id = b.boq_id
LEFT JOIN comp_companies c ON c.comp_id = b.boq_comp_id
LEFT JOIN crm_contacts crm ON crm.contact_id = b.boq_client_id
WHERE r.status = 'active'
AND r.doc_type = 'inv'
AND b.boq_status = 'active'
GROUP BY r.id
HAVING is_due_today = '1'
ORDER BY r.doc_date DESC
LIMIT 10
ваше 'if' overlap .. 'current_date> = r.due_date' и' r.due_date = current_date' будет инициировать BOTH, если значения равны. поэтому вы в основном говорите, что что-то из-за «сегодняшнего дня» как просрочено, так и сегодня. –
Булево значение по определению '1' и' 0'. Нет необходимости переводить 'IF'. – shmosel
Вместо того, чтобы помещать 'SELECT' в каждый' IF', я предлагаю вам присоединиться к подзапросу, который вычисляет 'SUM (amount_received) GROUP BY r_id'. – Barmar