Re: [請益] PHP迴圈+Mysql搜尋優化問題
※ 引述《kingoface (桑原)》之銘言:
: 大家好,
: 狀況類似是這樣
: Table
: shop id price
: s001 EXA001 500
: A0002 EXB002 400
: s001 EXC001 300
: g0012 EXD003 350
: b002 EXA001 500
: b002 EXA001 500
: shop會有不同的編碼,沒有規則,字元不固定.
: id是有規則的編碼,只有前三碼是數字,並且固定就6個字元
: 資料庫約有幾百萬筆類似資料
: 而我想要知道id分別為EXA,EXB,EXC在各分店的總銷售價格.
: 所以先做了兩個陣列
: 比如
既然全部都會用到,那不用判斷,直接全撈出來
$sql = "SELECT * FROM table";
$result = mysql_query ($sql)
while($row = mysql_fetch_assoc($result)){
$shop = $row['shop'];
$short_id = substr($row['id'],0,3);
$new_arr[$short_id][$shop] += $row['price'];
}
//你的資料表欄位應該不只這些,選擇必要的欄位就好。
$new_arr 就是你要的。這樣應該可以吧。程式碼簡短有力。
但是效率我就不知道了。
: $id_arr=array('EXA001','EXB002'~~~~~~~~~~巴拉巴拉);
: $shop_arr=array('s001','A0002'~~~~巴拉巴拉);
: 然後
: foreach($id_arr as $id_for)
: {
: foreach($shop_arr as $shop_for)
: {
: //以下開始叫出資料並且存成二為陣列,類似這樣
: $sql="SELECT SUM(num1) as sumprice FROM (SELECT price as num1 FROM table WHERE id LIKE '{$id_for}%' AND shop LIKE '{$shop_for}%') as num2 ";
: $sumprice = mysql_fetch_object($sql);
: $ans_arr[$id_for][$shop_for]=$sumprice->price;
: }
: }
不負責任隨便分析一下,
你原本兩個迴圈,幾百萬筆 * 幾百萬筆,那大概做了n億次的運算吧。
而且每一次的查詢裡面還有子查詢 @@
我的方法只查一次,沒有子查詢,php迴圈只有一次。
應該會快很多。
: 最後資料出來是出來了,但是跑了大概30多秒吧...超久.
: 我知道以上是很蠢的做法,囧興.
: 所以想要請教各位先進,有沒有更高級快速的做法呢?
: 我的想法是
: shop基本上應該還是用迴圈去跑,但是id可以判斷前三碼,只截取前三碼,
: 然後把他們GROUP BY,這樣可行嗎?
: 類似
: GROUP BY SUBSTR(id,0,2);
--
※ 發信站: 批踢踢實業坊(ptt.cc)
※ 編輯: anawak 來自: 61.231.92.60 (01/05 22:12)
討論串 (同標題文章)
PHP 近期熱門文章
PTT數位生活區 即時熱門文章