我需要使用基于第三個 JOIN 表的 JOIN 條件將 2 個表與第二個表連接起來。
問題是,我無法在仍然加入第二個表的同時從第三個 JOIN 表中獲取值。
在 DB Fiddle 上查看
Table A: users
-------
user_id INT PRIMARY
Table B: orders
-------
order_id INT PRIMARY
user_id INT
invoice_id INT
Table C: invoices
-------
invoice_id INT PRIMARY
invoice_status VARCHAR [voided, paid]
這就是我想要做的:
SELECT
A.user_id,
B.order_id,
C.invoice_id,
C.invoice_status
FROM users A
LEFT JOIN orders B
ON (B.user_id = A.user_id
AND C.invoice_status = 'paid')
LEFT JOIN invoices C
ON (C.invoice_id = B.invoice_id)
第 9 行AND C.invoice_status = 'paid')是指尚未加入的表 C,因此此查詢將導致Error in query (1054): Unknown column 'C.invoice_status' in 'on clause'
我不能在WHERE條款中有這個條件的原因是因為我仍然想回傳所有用戶記錄,無論他們是否有任何訂單或“已支付”發票。所以添加WHERE invoice_status = 'paid'不會回傳沒有任何訂單的用戶和帶有invoice_status= 'voided' 的用戶。
此外,當用戶有兩個訂單鏈接到兩個不同的發票記錄,但其中一張發票invoice_status是“已支付”,而另一張發票是“作廢”時,我只想回傳“已支付”記錄。可以有很多voided發票,但只有 1 個“已付”發票記錄。
順便說一句,這是強制執行的: sql_mode=only_full_group_by,所以我不能GROUP BY user_id在order_id&invoice_id欄位上沒有某種聚合或條件。
SELECT
A.user_id,
B.order_id,
C.invoice_id,
C.invoice_status
FROM users A
LEFT JOIN orders B
ON (B.user_id = A.user_id)
LEFT JOIN invoices C
ON (C.invoice_id = B.invoice_id);
| 用戶身份 | 訂單編號 | 發票編號 | 發票狀態 |
|---|---|---|---|
| 1 | 1 | 1 | 作廢 |
| 1 | 2 | 2 | 有薪酬的 |
| 2 | 3 | 1 | 作廢 |
| 3 | 空值 | 空值 | 空值 |
我想要的結果:
| 用戶身份 | 訂單編號 | 發票編號 | 發票狀態 |
|---|---|---|---|
| 1 | 2 | 2 | 有薪酬的 |
| 2 | 3 | 1 | 作廢 |
| 3 | 空值 | 空值 | 空值 |
每個user_id必須只回傳一次,invoice_status當有多個相關訂單時,= 'paid' 是首選行。
如果有人知道如何實作這一點,請欣賞它。
謝謝!
uj5u.com熱心網友回復:
使用ROW_NUMBER()函式 并根據行編號并根據user_id排序invoice_status然后獲取第一行
SELECT user_id,
order_id,
invoice_id,
invoice_status
FROM
(SELECT
A.user_id,
B.order_id,
C.invoice_id,
C.invoice_status,
ROW_NUMBER() OVER(PARTITION BY A.user_id ORDER BY C.invoice_status) AS num
FROM users A
LEFT JOIN orders B
ON (B.user_id = A.user_id)
LEFT JOIN invoices C
ON (C.invoice_id = B.invoice_id)) t
WHERE num = 1
資料庫<>小提琴
uj5u.com熱心網友回復:
EXISTS感謝ProGu的評論,我能夠通過使用來解決它。
SELECT
A.user_id,
B.order_id,
C.invoice_id,
C.invoice_status
FROM users A
LEFT JOIN orders B
ON B.user_id = A.user_id
AND EXISTS( SELECT
1
FROM
invoices
WHERE
invoices.invoice_id = B.invoice_id
AND invoices.invoice_status = 'paid')
LEFT JOIN invoices C
ON C.invoice_id = B.invoice_id
| 用戶身份 | 訂單編號 | 發票編號 | 發票狀態 |
|---|---|---|---|
| 1 | 2 | 2 | 有薪酬的 |
| 2 | 空值 | 空值 | 空值 |
| 3 | 空值 | 空值 | 空值 |
謝謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/380404.html
