我有一個查詢結合了多個位置的用戶餘額,並使用嵌套子查詢合併customer_balance表和merchant_groups表中的數據。 customer_balance表中需要第二個數據,這對每個商家來說都是唯一的。如何優化mySQL以使用JOIN而不是嵌套的IN查詢?
我想優化我的查詢以返回總和和唯一值,即結果的順序很重要。
例如,可能有三個商家在merchant_group:
id | group_id | group_member_id
1 12 36
2 12 70
3 12 106
用戶可能有2處一個平衡,但不是所有的customer_balance表:
id | group_member_id | user_id | balance | personal_note
1 36 420 1.00 "Likes chocolate"
2 70 420 20.00 null
發現有ISN在餘額表中的第三行。
我想要結束的是能夠拉平衡的總和以及最合適的personal_note。
到目前爲止,我有與下面的查詢所有情況下,這種工作:
SELECT sum(c.cash_balance) as cash_balance,n.customer_note FROM customer_balance AS c
LEFT JOIN (SELECT customer_note, user_id FROM customer_balance
WHERE user_id = 420 AND group_member_id = 36) AS n on c.user_id = n.user_id
WHERE c.user_id = 420 AND c.group_id IN (SELECT group_member_id FROM merchant_group WHERE group_id = 12)
我可以適當地改變了group_member_id,我總是會得到預期的合併資產負債及相應的音符。即就是我正在尋找的是: 餘額:21.00 customer_note:「喜歡巧克力」或Null(取決於group_member_id)
是否有可能不使用資源重嵌套查詢例如優化這個查詢使用JOIN? (或其他方法)。
我嘗試了一些選項,但不能在任何情況下都能正常工作。以下是我得到的最接近,但這個不返回正確的音符:
SELECT sum(cb.balance), cb.personal_note FROM customer_balance AS cb
LEFT JOIN merchant_group AS mg on mg.group_member_id = cb.group_member_id
WHERE cb.user_id = 420 && mg.group_id = 12
ORDER BY (mg.group_member_id = 106)
我也嘗試過另一種選擇(但由於失去了查詢)的作品,而不是當group_member_id = 106 - 因爲在一張表中沒有記錄(但這是一個我想要迎合的有效用例)。
謝謝!
這是真正優秀的,謝謝@scaisEdge。出於興趣,我只是假設使用像這樣的JOIN,而不是基於大量文章的嵌套選擇,性能會更好 - 這是一個正確的斷言嗎? – contool
是的...通常,連接對於子查詢來說是最高效的,尤其是對於子句中的(因爲連接避免了與in ...子句中有關的重複掃描,其實是重複的OR) – scaisEdge
換句話說:'IN(SELECT .. )應該避免。 –