2012-10-27 113 views
-1

新手PHP/Mysql用戶在這裏...希望有人可以幫助我讓這些代碼運行得更快。試圖簡單計算足球隊在季前至今的進攻和防守平均數......在ms excel中,這需要不到10秒的時間和sumifs。用下面的代碼使用php/mysql發佈,需要3個小時!我知道我可以做一些更好的事情......只是不確定是什麼!謝謝。PHP Mysql查詢疑難解答

mysql_query("UPDATE nfl_new SET Season = if(MONTH(date)<5, YEAR(date)-1,YEAR(date))"); 
     $sql= "SELECT * FROM nfl_new"; 

     if (!$results = mysql_query($sql,$con)) 
      { 
     die('Error: ' . mysql_error()); 
      } 

     $num = mysql_numrows($results); 
     $i = 0; 
     while ($i < $num) { 
     //get a row from mysql one at a time  
     $row = mysql_fetch_row($results, $i); 

     //calculate aw teams's offense 
     $awscoreaw = mysql_query("SELECT SUM(aw_score) AS awscoreaw FROM nfl_new WHERE away='$row[away]' AND date<'$row[date]' AND Season='$row[Season]'"); 
     $awgames = mysql_query("SELECT SUM(if((away = '$row[away]' OR home = '$row[away]') AND date<'$row[date]' AND Season='$row[Season]', 1, 0)) AS awgames FROM nfl_new"); 
     $awgamesaw = mysql_query("SELECT SUM(if(away = '$row[away]' AND date<'$row[date]' AND Season='$row[Season]', 1, 0)) AS awgamesaw FROM nfl_new"); 
     $awgameshm = mysql_query("SELECT SUM(if(home = '$row[away]' AND date<'$row[date]' AND Season='$row[Season]', 1, 0)) AS awgameshm FROM nfl_new"); 
     $awscorehm = mysql_query("SELECT SUM(hm_score) AS awscorehm FROM nfl_new WHERE home='$row[away]' AND date<'$row[date]' AND Season='$row[Season]'"); 
     $awscoreaw = mysql_fetch_assoc($awscoreaw); 
     $awscorehm = mysql_fetch_assoc($awscorehm); 
     $awgames = mysql_fetch_assoc($awgames); 
     $awgamesaw = mysql_fetch_assoc($awgamesaw); 
     $awgameshm = mysql_fetch_assoc($awgameshm); 
     $aw_off = ($awscoreaw['awscoreaw'] + $awscorehm['awscorehm']+$awgamesaw['awgamesaw']*1.5-$awgameshm['awgameshm']*1.5)/$awgames['awgames']; 

     //calculate aw teams's defense 
     $awscoreaw = mysql_query("SELECT SUM(hm_score) AS awscoreaw FROM nfl_new WHERE away='$row[away]' AND date<'$row[date]' AND Season='$row[Season]'"); 
     $awgames = mysql_query("SELECT SUM(if((away = '$row[away]' OR home = '$row[away]') AND date<'$row[date]' AND Season='$row[Season]', 1, 0)) AS awgames FROM nfl_new"); 
     $awgamesaw = mysql_query("SELECT SUM(if(away = '$row[away]' AND date<'$row[date]' AND Season='$row[Season]', 1, 0)) AS awgamesaw FROM nfl_new"); 
     $awgameshm = mysql_query("SELECT SUM(if(home = '$row[away]' AND date<'$row[date]' AND Season='$row[Season]', 1, 0)) AS awgameshm FROM nfl_new"); 
     $awscorehm = mysql_query("SELECT SUM(aw_score) AS awscorehm FROM nfl_new WHERE home='$row[away]' AND date<'$row[date]' AND Season='$row[Season]'"); 
     $awscoreaw = mysql_fetch_assoc($awscoreaw); 
     $awscorehm = mysql_fetch_assoc($awscorehm); 
     $awgames = mysql_fetch_assoc($awgames); 
     $awgamesaw = mysql_fetch_assoc($awgamesaw); 
     $awgameshm = mysql_fetch_assoc($awgameshm); 
     $aw_def = ($awscoreaw['awscoreaw'] + $awscorehm['awscorehm']-$awgamesaw['awgamesaw']*1.5+$awgameshm['awgameshm']*1.5)/$awgames['awgames']; 

     //calculate hm teams's offense 
     $hmscoreaw = mysql_query("SELECT SUM(aw_score) AS awscoreaw FROM nfl_new WHERE away='$row[home]' AND date<'$row[date]' AND Season='$row[Season]'"); 
     $hmgames = mysql_query("SELECT SUM(if((away = '$row[home]' OR home = '$row[home]') AND date<'$row[date]' AND Season='$row[Season]', 1, 0)) AS awgames FROM nfl_new"); 
     $hmgamesaw = mysql_query("SELECT SUM(if(away = '$row[home]' AND date<'$row[date]' AND Season='$row[Season]', 1, 0)) AS awgamesaw FROM nfl_new"); 
     $hmgameshm = mysql_query("SELECT SUM(if(home = '$row[home]' AND date<'$row[date]' AND Season='$row[Season]', 1, 0)) AS awgameshm FROM nfl_new"); 
     $hmscorehm = mysql_query("SELECT SUM(hm_score) AS awscorehm FROM nfl_new WHERE home='$row[home]' AND date<'$row[date]' AND Season='$row[Season]'"); 
     $hmscoreaw = mysql_fetch_assoc($hmscoreaw); 
     $hmscorehm = mysql_fetch_assoc($hmscorehm); 
     $hmgames = mysql_fetch_assoc($hmgames); 
     $hmgamesaw = mysql_fetch_assoc($hmgamesaw); 
     $hmgameshm = mysql_fetch_assoc($hmgameshm); 
     $hm_off = ($hmscoreaw['awscoreaw'] + $hmscorehm['awscorehm']+$hmgamesaw['awgamesaw']*1.5-$hmgameshm['awgameshm']*1.5)/$hmgames['awgames']; 

     //calculate hm teams's defense 
     $hmscoreaw = mysql_query("SELECT SUM(hm_score) AS awscoreaw FROM nfl_new WHERE away='$row[home]' AND date<'$row[date]' AND Season='$row[Season]'"); 
     $hmgames = mysql_query("SELECT SUM(if((away = '$row[home]' OR home = '$row[home]') AND date<'$row[date]' AND Season='$row[Season]', 1, 0)) AS awgames FROM nfl_new"); 
     $hmgamesaw = mysql_query("SELECT SUM(if(away = '$row[home]' AND date<'$row[date]' AND Season='$row[Season]', 1, 0)) AS awgamesaw FROM nfl_new"); 
     $hmgameshm = mysql_query("SELECT SUM(if(home = '$row[home]' AND date<'$row[date]' AND Season='$row[Season]', 1, 0)) AS awgameshm FROM nfl_new"); 
     $hmscorehm = mysql_query("SELECT SUM(aw_score) AS awscorehm FROM nfl_new WHERE home='$row[home]' AND date<'$row[date]' AND Season='$row[Season]'"); 
     $hmscoreaw = mysql_fetch_assoc($hmscoreaw); 
     $hmscorehm = mysql_fetch_assoc($hmscorehm); 
     $hmgames = mysql_fetch_assoc($hmgames); 
     $hmgamesaw = mysql_fetch_assoc($hmgamesaw); 
     $hmgameshm = mysql_fetch_assoc($hmgameshm); 
     $hm_def = ($hmscoreaw['awscoreaw'] + $hmscorehm['awscorehm']-$hmgamesaw['awgamesaw']*1.5+$hmgameshm['awgameshm']*1.5)/$hmgames['awgames']; 




     mysql_query("UPDATE nfl_new SET aw_off='$aw_off', aw_def='$aw_def', hm_off='$hm_off', hm_def='$hm_def' WHERE away='$row[away]' AND date='$row[date]' AND Season='$row[Season]'"); 

     echo $row['date'].' '.$row['away'].' '.$aw_def.'<br />'; 
     ob_flush(); 
    flush(); 
     $i++; 
     } 

下面是顯示輸出CREATE TABLE

nfl_new CREATE TABLE `nfl_new` (
`id` int(8) NOT NULL AUTO_INCREMENT, 
`date` date NOT NULL, 
`away` varchar(40) NOT NULL, 
`aw_line` varchar(6) NOT NULL, 
`home` varchar(40) NOT NULL, 
`hm_line` varchar(6) NOT NULL, 
`total` varchar(6) NOT NULL, 
`aw_score` int(3) NOT NULL, 
`hm_score` int(3) NOT NULL, 
`aw_firstdown` int(3) NOT NULL, 
`hm_firstdown` int(3) NOT NULL, 
`aw_rush_att` int(3) NOT NULL, 
`hm_rush_att` int(3) NOT NULL, 
`aw_rush_yds` varchar(3) NOT NULL, 
`hm_rush_yds` varchar(3) NOT NULL, 
`aw_pass_yds` varchar(3) NOT NULL, 
`hm_pass_yds` varchar(3) NOT NULL, 
`aw_ret_yds` varchar(3) NOT NULL, 
`hm_ret_yds` varchar(3) NOT NULL, 
`aw_pass_comp` int(3) NOT NULL, 
`hm_pass_comp` int(3) NOT NULL, 
`aw_pass_att` int(3) NOT NULL, 
`hm_pass_att` int(3) NOT NULL, 
`aw_int` int(2) NOT NULL, 
`hm_int` int(2) NOT NULL, 
`aw_sacks` int(2) NOT NULL, 
`hm_sacks` int(2) NOT NULL, 
`aw_sack_yds` int(3) NOT NULL, 
`hm_sack_yds` int(3) NOT NULL, 
`aw_fum` int(2) NOT NULL, 
`hm_fum` int(2) NOT NULL, 
`aw_fum_lost` int(2) NOT NULL, 
`hm_fum_lost` int(2) NOT NULL, 
`aw_pen` int(3) NOT NULL, 
`hm_pen` int(3) NOT NULL, 
`aw_pen_yds` int(4) NOT NULL, 
`hm_pen_yds` int(4) NOT NULL, 
`aw_fg_att` int(2) NOT NULL, 
`hm_fg_att` int(2) NOT NULL, 
`aw_fg` int(2) NOT NULL, 
`hm_fg` int(2) NOT NULL, 
`aw_top` varchar(8) NOT NULL, 
`hm_top` varchar(8) NOT NULL, 
`Season` year(4) NOT NULL, 
`aw_off` double NOT NULL, 
`aw_def` double NOT NULL, 
`hm_off` double NOT NULL, 
`hm_def` double NOT NULL, 
`aw_mov` double NOT NULL, 
`hm_mov` double NOT NULL, 
`aw_sos` double NOT NULL, 
`hm_sos` double NOT NULL, 
`aw_sim` double NOT NULL, 
`hm_sim` double NOT NULL, 
`aw_ypp_off` double NOT NULL, 
`aw_ypp_def` double NOT NULL, 
`hm_ypp_off` double NOT NULL, 
`hm_ypp_def` double NOT NULL, 
`aw_ypp_mov` double NOT NULL, 
`hm_ypp_mov` double NOT NULL, 
`aw_ypp_sos` double NOT NULL, 
`hm_ypp_sos` double NOT NULL, 
`aw_ypp_sim` double NOT NULL, 
`hm_ypp_sim` double NOT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=6733 DEFAULT CHARSET=latin1 
+0

這就是單獨的查詢數量,乘以多少個團隊,3小時是正確的; p。 –

+0

表格的結構和行數是多少?一些查詢可以結合使用,但更多信息將有所幫助。 –

+0

表中有6600行。大多數列是varchar,ints或double。 – user1043610

回答

0

我不能完全肯定自己在做什麼,但我覺得這一切組合到一個查詢:

SELECT n2.date, n2.season, n2.away, 
     SUM(n2.away IN (n1.away, n1.home)) AS awgames, 
     SUM(n2.home IN (n1.away, n1.home)) AS hmgames, 
     SUM(n2.away = n1.away) AS awgamesaw, 
     SUM(n2.away = n1.home) AS awgameshm, 
     SUM(n2.home = n1.away) AS hmgamesaw, 
     SUM(n2.home = n1.home) AS hmgameshm, 
     SUM(IF(n2.away = n1.away, aw_score)) AS awgamesaw_awscore, 
     SUM(IF(n2.away = n1.away, hm_score)) AS awgamesaw_hmscore, 
     SUM(IF(n2.away = n1.home, aw_score)) AS awgameshm_awscore, 
     SUM(IF(n2.away = n1.home, hm_score)) AS awgameshm_hmscore, 
     SUM(IF(n2.home = n1.away, aw_score)) AS hmgamesaw_awscore, 
     SUM(IF(n2.home = n1.away, hm_score)) AS hmgamesaw_hmscore, 
     SUM(IF(n2.home = n1.home, aw_score)) AS hmgameshm_awscore, 
     SUM(IF(n2.home = n1.home, hm_score)) AS hmgameshm_hmscore, 
FROM nfl_new n1 JOIN nfl_new n2 
ON n1.date < n2.date AND n1.season = n2.season AND (n2.home IN (n1.home, n1.away) OR n2.away IN (n1.home, n1.away)) 
GROUP BY n2.date, n2.season, n2.away 

不過,我不確定這個分組。您的原始查詢沒有進行分組,但是當它打印結果時,它只會打印日期,季節和遠離第一個查詢的位置,這似乎是您考慮的方式。

它需要這麼長時間(重複查詢之外)的原因是它似乎是一個二次計算。您正在循環查詢第一個查詢返回的所有行,並且對於每個行,您總結了季節之前的所有行。這是很多重複。

執行查詢可能會更好,該查詢返回按季節和日期排序的所有行,並計算PHP代碼中的運行總計。也可以使用用戶定義的變量直接在SQL中執行此操作。我現在太累了,無法編寫該版本的查詢。

+0

感謝您的幫助!對不起,關於日期,季節,令人困惑的打印輸出...這只是一個錯誤檢查機制,我在代碼中。我要試着實現你的代碼,看看它是否有幫助...關於使用PHP來完成計算的好主意。 – user1043610