现在有 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 @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 1
@gonethen 新手都喜欢一条简单 sql 出来,可以彰显技术。事实上不是所有的业务都行的,尤其是 mysql,根据逻辑来写 sql。没看到具体表和业务逻辑,数据结构,无法判断,硬要凑,就子查询拼起来,也就是你说的一条 sql。还有一种办法,你在 select 里面写查询。这个具体看你的结果集多大咯。
|
26
akira 2018-04-04 23:52:43 +08:00
做汇总查询的时候,个人习惯是尽量先做汇总再来 join, 这样虽然最终代码量可能会多几行,但是条理很清理,最重要的是,每一部分要排查错误都非常容易。
就你这个例子的话,我会先分别做 sum 操作,然后再对出来的结果表做 join 操作 |