求 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 就不对了呢

4559 次点击
所在节点    MySQL
26 条回复
eluotao
2018-04-04 12:11:03 +08:00
写错 sql 了
gonethen
2018-04-04 14:13:09 +08:00
@eluotao 应该怎么写啊?求指教
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 里
gonethen
2018-04-04 14:23:06 +08:00
@BlackGrasshopper ac.up_id 就是 m.id ,我这个 ON 条件是想查出来某个代理下的所有子代理下的所有用户,这个写到 where 里怎么 group by 呢?
canbingzt
2018-04-04 14:25:56 +08:00
感觉可以写 2 条 left join 吧
left join manager m1 on m1.subCode=m.subCode
left join ac on ac.up_id=m1.id
gonethen
2018-04-04 14:31:26 +08:00
@canbingzt 我试了一下,确实可以分成两个,但结果还是不对,大神能不能加好友指导一下,nickname 即我微信
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;

多调试,实践出真知.
begga
2018-04-04 14:36:09 +08:00
SELECT
m.id,
...
SUM(ac.字段),
...
SUM(ma.字段),
...
FROM m ,ac ,ma
WHERE m.id=ac.up_id AND m.id=ma.id AND m.subCode ='0' AND ma.subCode='0'
GROUP BY m.id
wjpdev
2018-04-04 14:37:29 +08:00
那个,where m.status='0' 不要了. 忘了删
gonethen
2018-04-04 14:40:45 +08:00
@wjpdev 字段有点涉及公司隐私,可否加个微信单独请教,nickname 即我微信
begga
2018-04-04 14:45:31 +08:00
你这三张表?,manager 是什么表?
gonethen
2018-04-04 14:46:19 +08:00
@begga 就是 m 表
begga
2018-04-04 14:53:26 +08:00
SELECT
m.id,
...
sum(ac.字段),
...
sum(ma.字段),
...
FROM m ,ac ,ma
where m.id=ac.up_id and m.id=ma.id and m.subCode = ma.subCode and m.status = '0'
GROUP BY m.id


m.id=ac.up_id and m.id=ma.id (把三张表关联成一张表)然后就当作单表操作了。
linyinma
2018-04-04 15:06:13 +08:00
对了才怪,你想统计用户月度流水结果集 ac, 代理月度流水结果集 ma,使用 left join
sum(ac.字段) 应该是正确的,sum(ma.字段)小于正确值; 因为第一次 left join 的结果集应该小于正确的结果集

两种解决办法
( 1 )分开计算啊;
( 2 )采用 FULL JOIN
linyinma
2018-04-04 15:09:47 +08:00
sorry,我刚描述的采用 FULL JOIN 不对, 因为你最好 grup by m.id, FULL JOIN 导致结果集 m.id , 统计小于正确结果集
gonethen
2018-04-04 15:12:20 +08:00
@begga 就是不用 left join 是吧?我试了,查询结果还是不对
begga
2018-04-04 15:25:48 +08:00
@gonethen 需求我没有看懂。- -
gonethen
2018-04-04 15:30:15 +08:00
@linyinma
你好像说到点上了,
我知道可以分两个 sql 来写,但是只能分开计算吗?
我 sum 出来的数据都大于分开计算的数据,
假设分开计算的数据是正确数据(我相信是正确的)
ac 正确数据的 7 倍,ma 是正确数据的 14 倍

这样描述问题,您看能发现是什么问题吗?
gonethen
2018-04-04 15:31:08 +08:00
@begga 能加个微信单独请教吗,nickname 即我微信
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

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

https://www.v2ex.com/t/444237

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

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

© 2021 V2EX