作者dlikeayu (太陽拳vs野球拳)
看板PHP
標題Re: [請益] PHP迴圈+Mysql搜尋優化問題
時間Mon Dec 23 21:44:35 2013
SELECT `shop` , SUM( price ) AS TOTAL_PRICE
FROM `table`
WHERE id
IN (
'EXB001', 'EXB002'
)
AND `shop`
IN (
'a001', 'a0004', 'a002'
) GROUP BY `shop`
※ 引述《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在各分店的總銷售價格.
: 所以先做了兩個陣列
: 比如
: $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;
: }
: }
: 最後資料出來是出來了,但是跑了大概30多秒吧...超久.
: 我知道以上是很蠢的做法,囧興.
: 所以想要請教各位先進,有沒有更高級快速的做法呢?
: 我的想法是
: shop基本上應該還是用迴圈去跑,但是id可以判斷前三碼,只截取前三碼,
: 然後把他們GROUP BY,這樣可行嗎?
: 類似
: GROUP BY SUBSTR(id,0,2);
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 111.249.153.232
1F:→ kosjason:in的效能很可觀耶 尤其是字串 這樣下 應該會locked喔 12/23 21:54
2F:→ dlikeayu:應該比幾萬次的Like好更多吧@@? 12/23 22:16
3F:推 chenlarry:我也覺得應該會比like好很多,每次的like都是full table 12/23 22:51
4F:→ MOONRAKER:IN對LIKE,還滿好笑的 |D 認為IN會輸何不EXPLAIN一下 12/23 22:51
5F:→ chenlarry:scan ..@@ 12/23 22:51