2013-07-16 28 views
0

試圖在MYSQL數據庫中查找數組的中位數。查找中位數的Mysql

目前,我抓住我的數據,像這樣:

$middleMonth = "SELECT Day, COUNT(Day) AS totalNumber FROM finalbaby GROUP BY Day ORDER BY COUNT(Day) DESC LIMIT 1, 300"; 
$middleResult = mysql_query($middleMonth); 

我然後把它變成一個數組,像這樣。

$names=array(); 
while($row = mysql_fetch_assoc($middleResult)) { 
$names[] = $row['Day']; 

我則試圖找到數組的中位數:

  sort($names); 
      $count = count($names); 
      $middleval = floor(($count-1)/2); 
       if($count % 2) { 
        $median = $names[$middleval]; 
       } else { 
        $low = $names[$middleval]; 
        $high = $names[$middleval+1]; 
        $median = (($low+$high)/2); 
       } 

     return $median; 

     } 

     var_dump($names); 

我沒有得到任何錯誤,但它崩潰我的應用程序。

關於我在做什麼的任何建議是錯誤的?

+0

是否有原因會跳過第一行而不返回?通常情況下,我們希望使用「LIMIT 0,300」來包含第一行,而不是跳過第一行並返回從第二行開始的行,並使用「LIMIT 1,300」。 – spencer7593

+0

對不起斯賓塞。固定。 – qweqweqwe

+0

是否在第三個代碼塊之前關閉了第二個代碼中的黑色代碼? – amaster

回答

1

你是否在第三個代碼塊之前關閉第二個代碼中的黑色代碼?

回答:

我關閉,而在我的最後}

失敗...關閉,而在第二個代碼塊中第三代碼塊中運行的代碼之前...這會找到中位數只有一次,而不是每次從mysql返回的行中設置名稱時都試圖找到中值。第一次,名字的數量是1,然後你減去1 = 0併除以2。這會給你0.然後你嘗試獲得0和2的餘數。這將拋出你的其他代碼。試試這個:

$middleMonth = "SELECT Day, COUNT(Day) AS totalNumber FROM finalbaby GROUP BY Day ORDER BY COUNT(Day) DESC LIMIT 1, 300"; 
$middleResult = mysql_query($middleMonth); 
$names=array(); 
while($row = mysql_fetch_assoc($middleResult)) { 
    $names[] = $row['Day']; 
} 
sort($names); 
$count = count($names); 
$middleval = floor(($count-1)/2); 
if($count % 2) { 
    $median = $names[$middleval]; 
} else { 
    $low = $names[$middleval]; 
    $high = $names[$middleval+1]; 
    $median = (($low+$high)/2); 
} 
echo $median; 
var_dump($names); 

//previous code 
//if this code is inside function then return if not then print 
//return $median; 
//if this code is inside function then the return above will cancel this var_dump 
//var_dump($names); 

也請記住

警告! 此擴展從PHP 5.5.0開始已被棄用,並且將來會被刪除。應該使用MySQLiPDO_MySQL擴展名。有關更多信息,另請參閱MySQL: choosing an API指南和related FAQ