sql语句,having优化

mengfk000 2017-01-19 07:56:38
sql中的having速度很慢,怎么优化呢?
SELECT sd.send_detail_id, sd.amount, SUM(IFNULL(pb.qty,0)) AS c FROM p_host_send s INNER JOIN p_host_send_detail sd ON sd.send_id = s.send_id
LEFT JOIN p_host_boxcode pb ON sd.send_detail_id = pb.out_detail_id
WHERE s.send_id=8527 AND sd.part_id=1875 GROUP BY send_detail_id
HAVING c < amount
...全文
269 点赞 收藏 5
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
傲雪星枫 2017-01-20

SELECT sd.send_detail_id, sd.amount, SUM(IFNULL(pb.qty,0)) AS c FROM p_host_send s INNER JOIN (select send_detail_id,amount,send_id from p_host_send_detail where part_id=1875) sd  ON sd.send_id = s.send_id
               LEFT JOIN p_host_boxcode pb ON sd.send_detail_id = pb.out_detail_id
               WHERE s.send_id=8527 GROUP BY send_detail_id  
 HAVING c < amount 
试试这样会不会好点。
回复
natici 2017-01-19
明白了,原来老徐说的是最终结果不准确的问题,我还以为是性能问题呢
回复
xuzuning 2017-01-19
left join(左连接),结果集中将出现左表的全部记录 如果右表中不存在关联键值,则结果集中对应的列为 null 如果右表中关联键值不唯一,则结果集行数将多于左表行数 在这种情况下使用聚合函数,必然造成误差 尽管楼主用了 SUM(IFNULL(pb.qty,0)) 来排除 null 带来的影响(任何数与 null 的和为 null),但并没有排除关联键不唯一的情况 如果是 count 那就更糟了
引用 2 楼 natici 的回复:
[quote=引用 1 楼 xuzuning 的回复:] 不过你把聚合函数用在左连接的右表字段上,这通常都是要出问题的
请教老徐,为什么这么说呢?很好奇这个结论是经验所得还是手册上有写?[/quote]
引用 2 楼 natici 的回复:
[quote=引用 1 楼 xuzuning 的回复:] 不过你把聚合函数用在左连接的右表字段上,这通常都是要出问题的
请教老徐,为什么这么说呢?很好奇这个结论是经验所得还是手册上有写?[/quote]
回复
natici 2017-01-19
引用 1 楼 xuzuning 的回复:
不过你把聚合函数用在左连接的右表字段上,这通常都是要出问题的
请教老徐,为什么这么说呢?很好奇这个结论是经验所得还是手册上有写?
回复
xuzuning 2017-01-19
如果你认为,慢是 having 造成的,那么就把 having 子句删去,不做最后的过滤就是了 慢是你没有合理的规划 索引 造成的 不过你把聚合函数用在左连接的右表字段上,这通常都是要出问题的
回复
相关推荐
发帖
基础编程
创建于2007-09-28

2.1w+

社区成员

从PHP安装配置,PHP入门,PHP基础到PHP应用
申请成为版主
帖子事件
创建了帖子
2017-01-19 07:56
社区公告
暂无公告