作者emn178 (小残)
看板PHP
标题Re: [请益] 关於大笔资料的统计
时间Mon Mar 3 10:52:15 2008
※ 引述《okdla (跟着乡民进来看热闹)》之铭言:
: 请问一下,用php连mssql
: 如果mssql里的资料有快5万笔
: 统计起来很慢是不是算正常的呢???
: 比如说我mssql里有A资料表储存学生的姓名和基本资料,然後B资料表储存学生学科的
: 成绩
: 我要统计学生成绩在0-50,50-60,60-70,70-80,80-90,90-100的个数和学生性别的关系..
: 我用php的mssql_query去跑,可是要跑快2分钟,这是正常的吗??
: 还是说php无法处理太多笔数的资料表呢??
: 我是这样下指令的
: select count(*) from A where A.sex='F' and A.fid in (select fid from B where
: B.grade>=0 and B.grade<50)
: select count(*) from A where A.sex='M' and A.fid in (select fid from B where
: B.grade>=0 and B.grade<50)
括号中的select是一样的,但这样会重覆做两次
试着把他合并起来
SELECT A.sex, count(*) FROM A, B
WHERE A.fid = B.fid AND B.grade >=0 AND B.grade < 50
GROUP BY A.sex
会得到下面结果
sex count(*)
F XXX
M XXX
也可以尝试用php解决, 先用性别和分数做区分再跑一个for去统计
SELECT A.sex, B.grade, count(*) FROM A, B
WHERE A.fid = B.fid
GROUP BY A.sex, B.grade
ORDER BY A.sex, B.grade
应该会得到
sex grade count(*)
F 0 X
F 1 X
..
F 100 X
M 0 X
M 1 X
..
M 100 X
然後for去把count加起来, 这样就只有一个sql qurey和O(200)的回圈
或者0~50范围比较大, 独立一个sql query, 其他的一个query再搭配for
这样应该会比较快吧?
: .
: .
: .
: .
: fid是学生编号为唯一值,sex是性别,grade是成绩
: 大概是要做出一个如下的统计表
: 0-50 50-60 60-70 70-80 80-90 90-100
: ------------------------------------
: 男笔数
: 女笔数
: 是我指令下错了吗???还是php跑的本来就很慢呢???
: 建view的话速度可以变快吗???要如何建呢??
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.115.155.167