我有一个查询,它将用户在多个位置的余额合并在一起,并使用嵌套的子查询将来自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/

10-15 08:28