2017-02-28 28 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 .. )应该避免。 –