我有一个查询结合了多个位置的用户余额,并使用嵌套子查询合并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 .. )应该避免。 –