如何顯示與客戶相關的所有未完全支付的訂單?例如
顯示客戶“50”的“未付款”訂單的所有訂單詳細資訊
表:訂單
| ID | 合計訂單 | client_id |
|---|---|---|
| 1 | 15.00 | 50 |
| 2 | 18.50 | 50 |
| 3 | 40.00 | 50 |
表:order_payments
| order_id | 總支付 | 支付狀態 |
|---|---|---|
| 1 | 15.00 | 有薪酬的 |
| 2 | 3.50 | 打開 |
| 2 | 12.00 | 有薪酬的 |
*** 注意:并非每個訂單都有注冊付款。沒有注冊付款應被視為“開放”***
預期成績:
| order_id | 合計訂單 | client_id | 杰出的 |
|---|---|---|---|
| 1 | 15.00 | 50 | 0 |
| 2 | 18.50 | 50 | 6.50 |
| 3 | 40.00 | 50 | 40.00 |
我已經讓它作業了,但是在 PHP 的幫助下,回圈資料。但我想學習如何只用 sql 更有效地做到這一點。
uj5u.com熱心網友回復:
我測驗了你的表,我會這樣做:
SELECT o.id AS order_id, o.order_total, o.client_id,
(o.order_total - SUM(IF(op.payment_status = 'paid', op.total_paid, 0))) AS outstanding
FROM orders o
LEFT JOIN order_payments op ON o.id = op.order_id
GROUP BY o.id
ORDER BY outstanding ASC
uj5u.com熱心網友回復:
如果您有足夠新的 MySQL 版本(>= 8.0.14),我建議您使用橫向連接:
select o.*, op.total_paid, o.order_total - op.total_paid outstanding
from orders o
cross join lateral (
select coalesce(sum(op.total_paid), 0) total_paid
from order_payments op
where payment_status = 'open' and op.order_id = o.id
) op
關鍵字后面的子查詢lateral為每個訂單在支付表中搜索相關行,并回傳支付總額(如果沒有行,則回傳 0,或者沒有有效支付)。
橫向連接是 SQL 中的一個強大功能(它花了很長時間才進入 MySQL)。它們高效、靈活且富有表現力,在許多此類情況下都派上用場。
uj5u.com熱心網友回復:
select
orderss.id, orderss.ORDER_TOTAL, orderss.CLIENT_ID, nvl(A.Total_paid,0) as TOTAL_PAID,Orderss.ORDER_TOTAL-nvl(A.Total_paid,0) AS TOTAL _OUTSTANDING
from orders
left join
(select id,payment_status,Total_paid froM order_paymentss group by id,payment_status,Total_paid having Payment_status='paid')A
on orderss.id=A.id;
這應該很容易作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/526382.html
標籤:mysqlsql和左连接
上一篇:DISTINCT查詢和ORDERBY拋出mySQL錯誤
下一篇:限制和偏移MYSQL的排序問題
