У меня есть 2 таблицы:
manifests
id | customer | paid_order | price | payment_method
paid_orders
id | paid
JOIN paid_orders ON manifests.paid_order = paid_order_id
Предположим, что этот сценарий:
Есть 2customer
но имеет другойpayment_method
.
customer | paid_order | price | payment_method | paid |
1 | 1 | 200 | 0 | 200 |
1 | NULL | 100 | 1 | NULL |
2 | NULL | 150 | 1 | NULL |
Я только хочу, чтобы GROUP BY customer
но также PICK только payment_method
из 0
только если есть два одинаковых клиента.
Ожидаемый результат:
customer | paid_order | price | payment_method | paid |
1 | 1 | 200 | 0 | 200 |
2 | NULL | 150 | 1 | NULL |
Один из подходов заключался бы в том, чтобы всегда выбирать запись из одной или, возможно, более записей о клиентах, где метод payment_method
имеет минимальное значение:
SELECT m1.*
FROM manifest m1
INNER JOIN
(
SELECT customer, MIN(payment_method) AS min_payment_method
FROM manifest
GROUP BY customer
) m2
ON m1.customer = m2.customer AND m1.payment_method = m2.min_payment_method;
Эта логика должна работать, потому что если присутствует параметр payment_method
of zero, эта запись будет нацелена. В противном случае одно значение будет нацелено.
WHERE
для удобства чтения: select * from manifests where (customer, payment_method) in (select customer, min(payment_method) …
.
paid_order
записиmanifests
могут иметь одинаковые идентификаторыpaid_order
Игнорируяpayment_method = 1
мы можем сосредоточиться наcustomers
. Но я не хочу исключать всеpayment_method = 1
, потому что мне также нужен клиент.