求 mysql 大神,请教一个句子。

2018-04-04 11:38:41 +08:00
 gonethen

现在有 3 个表或结果集:

做 LEFT JOIN 查询,看结果应该是重复了好几次,实在不知道问题在哪,该怎么改了。 特来请教 v2 的大神们,到底是哪里出错了,该怎么改,有没有可以优化的地方。 多谢啦!

sql 如下:

SELECT
    m.id,
    ...
    sum(ac.字段),
    ...
    sum(ma.字段),
    ...
FROM m
LEFT JOIN
    ac
ON ac.up_id IN (SELECT m1.id FROM manager AS m1 WHERE m1.subCode = m.subCode)
LEFT JOIN
    ma
ON m.subCode = ma.subCode
WHERE
    m.status = '0'
    ...
GROUP BY
    m.id

ps:如果把 ac 和 ma 拆分开,形成两个 sql,结果都是对的,为什么合起来用 LEFT JOIN 就不对了呢

4746 次点击
所在节点    MySQL
26 条回复
XOXO360
2018-04-04 16:58:46 +08:00
你这明显多对多关系。数据逻辑先理清楚再写 sql,只能说同一个代理多条,同一个用户多条。匹配不就翻倍了?
gonethen
2018-04-04 17:19:50 +08:00
@linyinma 我按照你说的改了一下,不知道为什么用 FULL JOIN 会报语法错误,把 FULL 改成 LEFT 就没语法错误。。。
@XOXO360 确实是这个道理,但是现在我不知道怎么改,求大神指点
gonethen
2018-04-04 17:31:09 +08:00
@linyinma Mysql 不支持 FULL JOIN。。。
XOXO360
2018-04-04 17:38:53 +08:00
@gonethen 新手都喜欢一条简单 sql 出来,可以彰显技术。事实上不是所有的业务都行的,尤其是 mysql,根据逻辑来写 sql。没看到具体表和业务逻辑,数据结构,无法判断,硬要凑,就子查询拼起来,也就是你说的一条 sql。还有一种办法,你在 select 里面写查询。这个具体看你的结果集多大咯。
gonethen
2018-04-04 17:52:49 +08:00
@XOXO360 谢谢指导。我现在也改成了子查询拼接
akira
2018-04-04 23:52:43 +08:00
做汇总查询的时候,个人习惯是尽量先做汇总再来 join, 这样虽然最终代码量可能会多几行,但是条理很清理,最重要的是,每一部分要排查错误都非常容易。

就你这个例子的话,我会先分别做 sum 操作,然后再对出来的结果表做 join 操作

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/444237

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX