现在有 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 就不对了呢
![]() | 1 eluotao 2018-04-04 12:11:03 +08:00 via iPhone 写错 sql 了 |
3 BlackGrasshopper 2018-04-04 14:18:17 +08:00 你并没有写 ac 表和其它标的关系,ON ac.up_id IN (SELECT m1.id FROM manager AS m1 WHERE m1.subCode = m.subCode)应该写好对应关系写在 where 里 |
![]() | 4 gonethen OP 2018-04-04 14:23:06 +08:00 @BlackGrasshopper ac.up_id 就是 m.id ,我这个 ON 条件是想查出来某个代理下的所有子代理下的所有用户,这个写到 where 里怎么 group by 呢? |
![]() | 5 canbingzt 2018-04-04 14:25:56 +08:00 |
![]() | 6 gonethen OP @canbingzt 我试了一下,确实可以分成两个,但结果还是不对,大神能不能加好友指导一下,nickname 即我微信 |
![]() | 7 wjpdev 2018-04-04 14:34:31 +08:00 你若是给个完整的,即便是错误的 sql,我都好解答一点,里面的... 哪个晓的省略的是个什么鬼,Biu~ 丢一个参考答案: select m.id, sum(ac_字段), sum(ma_字段) from( select m.id,ac.字段 as ac_字段, 0 as ma_字段 from m left join ac on m.status = '0' and ... and ac.up_id in (SELECT m1.id FROM manager AS m1 WHERE m1.subCode = m.subCode) union select m.id, 0 as ac_字段, ma.字段 as ma_字段 from m left join ma on m.status = '0' and ... and m.subCode = ma.subCode ) C where m.status = '0' group by m.id; 多调试,实践出真知. |
8 begga 2018-04-04 14:36:09 +08:00 |
![]() | 9 wjpdev 2018-04-04 14:37:29 +08:00 那个,where m.status='0' 不要了. 忘了删 |
11 begga 2018-04-04 14:45:31 +08:00 你这三张表?,manager 是什么表? |
13 begga 2018-04-04 14:53:26 +08:00 |
14 linyinma 2018-04-04 15:06:13 +08:00 对了才怪,你想统计用户月度流水结果集 ac, 代理月度流水结果集 ma,使用 left join sum(ac.字段) 应该是正确的,sum(ma.字段)小于正确值; 因为第一次 left join 的结果集应该小于正确的结果集 两种解决办法 ( 1 )分开计算啊; ( 2 )采用 FULL JOIN |
15 linyinma 2018-04-04 15:09:47 +08:00 |
![]() | 18 gonethen OP @linyinma 你好像说到点上了, 我知道可以分两个 sql 来写,但是只能分开计算吗? 我 sum 出来的数据都大于分开计算的数据, 假设分开计算的数据是正确数据(我相信是正确的) ac 正确数据的 7 倍,ma 是正确数据的 14 倍 这样描述问题,您看能发现是什么问题吗? |
20 linyinma 2018-04-04 15:57:01 +08:00 实在要写成一条那就这样吧: SELECT id, T1.acX1 ... T2.maXn FROM ( SELECT m.id, sum(ac.字段 1) as acX1, ... sum(ac.字段 n) as acXn, FROM m LEFT JOIN ac ON ac.up_id IN (SELECT m1.id FROM manager AS m1 WHERE m1.subCode = m.subCode) GROUP BY m.id HAVING m.status = '0' ) as T1 FULL JOIN ( SELECT m.id, sum(ma.字段 1) as maX1, ... sum(ma.字段 n) as maXn, FROM m LEFT JOIN ma ON m.subCode = ma.subCode GROUP BY m.id HAVING m.status = '0' ) as T2 ON T1.id = T2.id |
21 XOXO360 2018-04-04 16:58:46 +08:00 你这明显多对多关系。数据逻辑先理清楚再写 sql,只能说同一个代理多条,同一个用户多条。匹配不就翻倍了? |
![]() | 22 gonethen OP |
24 XOXO360 2018-04-04 17:38:53 +08:00 ![]() @gonethen 新手都喜欢一条简单 sql 出来,可以彰显技术。事实上不是所有的业务都行的,尤其是 mysql,根据逻辑来写 sql。没看到具体表和业务逻辑,数据结构,无法判断,硬要凑,就子查询拼起来,也就是你说的一条 sql。还有一种办法,你在 select 里面写查询。这个具体看你的结果集多大咯。 |
![]() | 26 akira 2018-04-04 23:52:43 +08:00 做汇总查询的时候,个人习惯是尽量先做汇总再来 join, 这样虽然最终代码量可能会多几行,但是条理很清理,最重要的是,每一部分要排查错误都非常容易。 就你这个例子的话,我会先分别做 sum 操作,然后再对出来的结果表做 join 操作 |