统计sql语句

zzxoyo 2009-08-24 04:04:21
要求是,统计各地市每个单位的合同金额
求一个sql语句,大意如下

//这个是地市的表,可通过条件再加入详细查询条件,比如说只查询某省;
$query = mysql_query("SELECT * FROM area where order by area_id asc")
while(mysql_fetch_array($query))
{
if($values_c['parent_id'] == 0 ) $mywheres = "province=".$values_c['area_id'];
else $mywheres = "city=".$values_c['area_id'];

//这个是员工表,每人查询员工的数量也不一样,
$query2 = mysql_query("SELECT id FROM guest where uid in (1,2,400,1000,....) and $mywheres order by area_id asc")

//这里需要知道单位的数量
$number_counts = $_SGLOBAL['db']->num_rows($number);

$nums = 0;
//这里要查询出每个单位下的合同总金额
while($array2 = mysql_fetch_array($query2))
{
$number_money = $_SGLOBAL['db']->query("SELECT sum(money) as money FROM `oa_contract` WHERE fid=".$array2['id']);
$array_money = $_SGLOBAL['db']->fetch_array($number_money);
$nums += $array_money['money'];
}
}

大致意思如上,用最原始代码标注出来,但是现在数据量在100万,以上
现在速度变的极慢
求高手给个语句

...全文
333 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
CYBEREXP2008 2009-08-24
  • 打赏
  • 举报
回复

//这个是地市的表,可通过条件再加入详细查询条件,比如说只查询某省;
$query = mysql_query("SELECT * FROM area where order by area_id asc")
while(mysql_fetch_array($query))
{
if($values_c['parent_id'] == 0 )
$mywheres = "province=".$values_c['area_id'];
else
$mywheres = "city=".$values_c['area_id'];

//这个是员工表,每人查询员工的数量也不一样,
$query2 = mysql_query("SELECT id FROM guest where uid in (1,2,400,1000,....) and $mywheres order by area_id asc")

//这里需要知道单位的数量
$number_counts = $_SGLOBAL['db']->num_rows($number);

$nums = 0;
//这里要查询出每个单位下的合同总金额
while($array2 = mysql_fetch_array($query2))
{
$number_money = $_SGLOBAL['db']->query("SELECT sum(money) as money FROM `oa_contract` WHERE fid=".$array2['id']);

$array_money = $_SGLOBAL['db']->fetch_array($number_money);

$nums += $array_money['money'];

}
}



楼主:你发的东西也太难看了啊!!以后用染色板加上,,,
程序猿之殇 2009-08-24
  • 打赏
  • 举报
回复
1 给查询条件适当加上索引.
2 优化程序.减少不必要的循环,比如说,你在算总数的时候,完全可以用一条sql语句实现,没有必要进行哪么多的循环,多次请求查询再算总值.
      $nums = 0; 
$query3 = "SELECT SUM(money) AS money FROM `oa_contract` oa LEFT JOIN guest ON oa.fid = guest.id WHERE guest.uid in (1,2,400,1000,....) and $mywheres";
$array3 = mysql_fetch_array($query2);
$nums = $array3['money'];
zzxoyo 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 foolbirdflyfirst 的回复:]
guest 表里的province,city,country 是要存储客户所在的具体省市县
[/Quote]

谢谢你的那个语句我运行了一下,速度很快,数据有了,但是分组却不是我希望的方式

SELECT sum(money) as money FROM `oa_contract` WHERE fid in (SELECT id FROM `oa_guest` WHERE $wheres $mywheres)

我把语句改成这样了,可以了,速度也很快

此贴就遮掩结贴吧,还是谢谢你,分是你的!
foolbirdflyfirst 2009-08-24
  • 打赏
  • 举报
回复
guest 表里的province,city,country 是要存储客户所在的具体省市县
======================================================================================
这个很没有必要,area表是树型结构对不对?你只要知道area_id是不是可以回溯找到上面一层?
为什么要province,city,country三个字段,你可以在area表加个标识,表明数据是省,还是市,还是国家
guset表通过area_id与area表关联,只要知道area_id值,就可以关联到area表知道这个area到底是省还是市还是国家。你这样设计连第一范式都不遵守阿。
fenyao 2009-08-24
  • 打赏
  • 举报
回复
如果是mysql5的话,就用存储过程吧,速度肯定能行
Abin-2008 2009-08-24
  • 打赏
  • 举报
回复
使用索引吧。
zzxoyo 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 foolbirdflyfirst 的回复:]
是不是你的地区表有100W数据?
1.guest 表直接建立个字段area_id与地区表关联就可以了,何必新开字段province,city这样呢?
2.根据1修改关联关系,这样一条联表sql就可以了,没必要分3条sql在业务端做。

[/Quote]

地区表,因是有条件查询的,要么是只查询各省,要么是某个的各市
foolbirdflyfirst 2009-08-24
  • 打赏
  • 举报
回复
类似这样。。因为guset表要返回所有数据,故作为left join 的左表。
=============================================================
select id,sum(money) as money from guset g
left join area a on a.area_id=g.area_id
left join oa_construct o on o.fid=g.id
where g.id in(1,2,3,4,5,6)
group by o.fid
YHL27 2009-08-24
  • 打赏
  • 举报
回复
sf!!!
zzxoyo 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 foolbirdflyfirst 的回复:]
是不是你的地区表有100W数据?
1.guest 表直接建立个字段area_id与地区表关联就可以了,何必新开字段province,city这样呢?
2.根据1修改关联关系,这样一条联表sql就可以了,没必要分3条sql在业务端做。

[/Quote]

地区表就是存储全国各地市县,一共几千条吧

guest 表里的province,city,country 是要存储客户所在的具体省市县


while($array2 = mysql_fetch_array($query2))
{
$number_money = $_SGLOBAL['db']->query("SELECT sum(money) as money FROM `oa_contract` WHERE fid=".$array2['id']);
$array_money = $_SGLOBAL['db']->fetch_array($number_money);
$nums += $array_money['money'];
}

主要问题在这里的循环上,因为如果权限够大,要循环110万次以上,此句屏蔽掉,数据载入瞬间就出来了
foolbirdflyfirst 2009-08-24
  • 打赏
  • 举报
回复
是不是你的地区表有100W数据?
1.guest 表直接建立个字段area_id与地区表关联就可以了,何必新开字段province,city这样呢?
2.根据1修改关联关系,这样一条联表sql就可以了,没必要分3条sql在业务端做。
zzxoyo 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zhoupuyue 的回复:]
uid in()是什么意思?每次都是固定的吗?这个地方用不上索引的吧!
explain  select 跟踪一下
[/Quote]

不固定的
阿_布 2009-08-24
  • 打赏
  • 举报
回复
一条select语句中的字段要建立复合索引,单独的索引可能重复的记录会比较多。
阿_布 2009-08-24
  • 打赏
  • 举报
回复
uid in()是什么意思?每次都是固定的吗?这个地方用不上索引的吧!
explain select 跟踪一下
zzxoyo 2009-08-24
  • 打赏
  • 举报
回复
我把每个语句 echo 出来,直接在mysql上执行,都不慢的,都是0.0几秒的,

就是一循环起来就慢了下来
zzxoyo 2009-08-24
  • 打赏
  • 举报
回复
有没有高手帮看看 呀,我鼓捣了一下午,始终没有一个好的方案

这个语句在本机执行都超过60秒,时间溢出

其中客户表大约110万数据

其他都只有几百条,速度怎么这么慢呢
zzxoyo 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhongqixing1104 的回复:]
合理的使用索引可以优化很多
[/Quote]
为了优化这个语句,凡是where 到的字段都做了索引

area 表,就三个字段,自增,父id,名字

guest,客户表,存储基本信息,但此地只用到他的自动id

oa_contract 合同表,fid 关联 guest,存储某个客户的交易金额
zhongqixing1104 2009-08-24
  • 打赏
  • 举报
回复
合理的使用索引可以优化很多
yutao_7871 2009-08-24
  • 打赏
  • 举报
回复
循环太多了,因为不知道你的表的具体结构,所以不能给出具体的优化方法。
你可以看看是否能够通过group by的操作来优化查询结果。
再设置好索引字段,把能够用整形表示的字段尽量都用整形存储
zzxoyo 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhangguofang1129 的回复:]
只知道这一个  把select * 改成 select 字段 
只知道这个,可能可以吧!
[/Quote]
上边的语句是为了叙述方便,用最原始的sql写出来的
加载更多回复(1)

21,891

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧