2017-02-28 26 views
1

我有一個查詢結合了多個位置的用戶餘額,並使用嵌套子查詢合併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 - 因爲在一張表中沒有記錄(但這是一個我想要迎合的有效用例)。

謝謝!

回答

1

這應該是等價的,但沒有再選擇

SELECT 
     sum(c.cash_balance) as cash_balance 
    , n.customer_note 
FROM customer_balance AS c 
LEFT JOIN customer_balance as n on (c.user_id = n.user_id AND n.group_member_id = 36 AND n.user_id = 420) 
INNER JOIN merchant_group as mg on ( c.group_id = mg.group_member_id AND mg.group_id = 12) 
WHERE c.user_id = 420 
+0

這是真正優秀的,謝謝@scaisEdge。出於興趣,我只是假設使用像這樣的JOIN,而不是基於大量文章的嵌套選擇,性能會更好 - 這是一個正確的斷言嗎? – contool

+2

是的...通常,連接對於子查詢來說是最高效的,尤其是對於子句中的(因爲連接避免了與in ...子句中有關的重複掃描,其實是重複的OR) – scaisEdge

+1

換句話說:'IN(SELECT .. )應該避免。 –