我有一个查询,它将用户在多个位置的余额合并在一起,并使用嵌套的子查询将来自customer_balance表和merchant_groups表的数据合并在一起。客户余额表中需要的第二条数据对每个商户都是唯一的。
我想优化我的查询以返回一个和和和一个唯一的值,即结果的顺序很重要。
例如,一个商户组中可能有三个商户:
id | group_id | group_member_id
1 12 36
2 12 70
3 12 106
用户可能在两个地点有余额,但并非全部在客户余额表中:
id | group_member_id | user_id | balance | personal_note
1 36 420 1.00 "Likes chocolate"
2 70 420 20.00 null
注意余额表中没有第三行。
最后我想说的是,我有能力得出平衡的总和,以及最合适的个人信息。
到目前为止,我在所有情况下都可以使用以下查询:
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)
我可以适当地更改组成员id,我将始终获得预期的合并余额和适当的注释。我要找的是:
余额:21.00
客户注释:“喜欢巧克力”或空(取决于组成员的id)
是否可以优化此查询而不使用资源密集的嵌套查询(例如使用联接)?(或其他方法)。
我已经尝试了很多选择,但不能让它在所有情况下工作。以下是我得到的最接近的,但这没有返回正确的注释:
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)
我还尝试了另一个可行的选项(但是由于丢失了查询),但是当组成员I d=106时不行,因为在一个表中没有记录(但这是一个有效的用例,我想提供)。
谢谢!
最佳答案
这应该是等效的,但没有子选择
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
关于mysql - 如何优化mySQL以使用JOIN而不是嵌套的IN查询?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42517522/