gpt4 book ai didi

mysql - 如何优化 mySQL 以使用 JOIN 而不是嵌套的 IN 查询?

转载 作者:行者123 更新时间:2023-11-28 23:19:16 25 4
gpt4 key购买 nike

我有一个查询,它结合了用户在多个位置的余额,并使用嵌套子查询来结合 customer_balance 表和 merchant_groups 表中的数据。 customer_balance 表中还需要第二条数据,每个商家都是唯一的。

我想优化我的查询以返回总和和唯一值,即结果的顺序很重要。

例如,一个merchant_group中可能有3个商户:

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

请注意,余额表中没有第 3 行。

我最终想要的是能够提取余额的总和以及最合适的 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.00customer_note:“喜欢巧克力”或 null(取决于 group_member_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)

我还尝试了另一个可行的选项(但因为丢失了查询),但当 group_member_id = 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com