mysql 中 join + group by 的问题

2014-05-06 09:54:51 +08:00
 Mac
select *
from
bill
left join container on bill.cid = container.cid
left join main on container.ntno = main.ntno
where main.ntno='140242'
group by bill.shipper

三个表,main表是索引,container表是main的子集以ntno连接,bill表是container表的子集以cid连接。
用left join后输出一个以bill表为基础的补全container和main信息的数据集。数据是正确的。

问题是,如果以bill表中的shipper字段做group by,问题就来了,这个shipper如果出现在不同container.cid中,group by合并就不起作用。何解?
4113 次点击
所在节点    MySQL
6 条回复
ybh37
2014-05-06 11:11:36 +08:00
你确定这样写没sql语法错误?
lichao
2014-05-06 11:26:59 +08:00
select 后面的内容,要么是聚合函数,要么是字段(字段必须出现在 group by 子句中),你 select * 是什么用意?
qdvictory
2014-05-06 11:36:26 +08:00
1. 写法问题,既然main是索引表,那么为什么不把main写在写面,这样反着写好蛋疼。
2. container既然与bill是一对多的关系,那么你group by的时候就要在Select *中处理好显示的是哪一条,比如你的sql执行出来是3条,那么按你出错时出来的sql肯定是>3条的,因此你的group by将多条sql合并成了一条,而结果为先出现的那一条,即你的错误答案。解决方法同2楼。
qdvictory
2014-05-06 11:38:50 +08:00
@qdvictory 不能编辑好麻烦。。。少打了点东西
你的sql执行出来是3条,那么按你出错时去掉group by出来的记录肯定是>3条的,因此你的group by将多条记录合并成了一条
Mac
2014-05-06 13:58:37 +08:00
@qdvictory

select main.ntno,container.c_no,bill.shipper,sum(bill.count_ctn),sum(bill.count_kgs),sum(bill.count_cbm)
from
bill
left join container on bill.cid = container.cid
left join main on container.ntno = main.ntno
where main.ntno='140242'
group by bill.shipper


写全点吧,本来select *是想简化题目的,现在写全。目的是让所有bill.shipper相同的数据合并输出件数毛重体积。但实际效果,shipper如果在两个cid中,他就不合并了,列出了两条记录。
qdvictory
2014-05-06 14:04:41 +08:00
@Mac 这样真的不好说看,建议你上全sql,从建表,插入测试数据,到sql。

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

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

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

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

© 2021 V2EX