Re: [請益] 關於大筆資料的統計
※ 引述《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
討論串 (同標題文章)
PHP 近期熱門文章
PTT數位生活區 即時熱門文章