2014-01-27 76 views
2

我有這樣的MySQL表:PHP MySQL的選擇陣列並檢查是否存在的價值

tab

在哪裏我想每個平臺的計數(在Windows,Linux,MAC,未知)。

請注意,在表中沒有macunknown數據,有沒有NUM將0

條件:

  • 順序必須像通緝輸出
  • 檢查者平臺是在表如果不加零則輸出

問題:如何在查詢中進行排序以獲得想要的輸出中的命令,並且如果表中沒有平臺,則添加零?

通緝輸出:

array (
    '0' => array('name' => 'windows', 'num' => 3), 
    '1' => array('name' => 'linux', 'num' => 3), 
    '2' => array('name' => 'mac', 'num' => 0), 
    '3' => array('name' => 'unknown', 'num' => 0) 
); 

我嘗試:

PHP:

function get_platforms() { 
    $query = " 
      SELECT platform, COUNT(platform) AS num 
      FROM stats 
      GROUP BY platform 
      ORDER BY platform ASC 
      "; 
    $select = mysqli_query($this->c, $query); 
    while ($row = mysqli_fetch_array($select)) { 
     $data[] = array(
      'name' => $row['platform'], 
      'num' => $row['num'] 
     ); 
    } 
    return $data; 
} 

當前outpup:

array (
    '0' => array ('name' => 'linux', 'num' => 3) 
    '1' => array ('name' => 'windows', 'num' => 3) 
); 
+1

是否有任何表或陣列'Platforms'的預定義列表? – Rikesh

+0

@Rikesh我在php函數中收集數據的數組。陣列是:[windows,linux,mac,unknown] –

回答

4

因爲你沒有在你的數據庫中的任何MAC或未知的數據,你不會得到任何結果這個平臺,甚至爲0。你能做什麼不能是與你的平臺預先配置的陣列期望得到:

$data = array(
    'windows' => 0, 
    'linux' => 0, 
    'mac' => 0, 
    'unknown' => 0 
) 

現在,在您get_platforms功能做到這一點:

function get_platforms() { 
    $query = " 
      SELECT platform, COUNT(platform) AS num 
      FROM stats 
      GROUP BY platform 
      ORDER BY platform ASC 
      "; 
    $select = mysqli_query($this->c, $query); 
    while ($row = mysqli_fetch_array($select)) { 
     $data[$row['platform']] = $row['num']; 
    } 
    return $data; 
} 

你最終會與此:

$data = array(
    'windows' => 3, 
    'linux' => 3, 
    'mac' => 0, 
    'unknown' => 0 
) 

然後你可以按照你想要的方式重新格式化數據。例如,你可以這樣做:

$result = array(); 
foreach($data as $platform => $count){ 
    $result[] = array('name' => $platform, 'count' => $count); 
} 

你將最終的結果你問相同的格式。

+0

你的第一個數組'$ platforms'應該命名爲'$ data',所以函數將會替換值。 –

+0

@ Ing.MichalHudak你是對的!讓我編輯答案! – gpopoteur

2

首先你應該確定所希望輸出的順序,可以說你有數組

$osList = array('linux', 'windows', 'mac', 'something'); 

現在取你的mysql結果臨時assoc命令數組:

$data = array(); 
$query = "SELECT platform, COUNT(platform) AS num" 
    . " FROM stats" 
    . " GROUP BY platform"; 
$result = mysqli_query($this->c, $query); 
while ($row = mysqli_fetch_array($result)) { 
    $data[$row['platform']] = (int) $row['num'];   
} 

在這裏你可以形成輸出陣列:

$output = array(); 
foreach ($osList as $os) { 
    $output[] = array(
     'name' => $os, 
     'count' => isset($data[$os]) ? $data[$os] : 0 
    ); 
} 
+0

+1工作解決方案 –

2

您必須有另一個表,其中包含所有平臺lis在那裏。例如,我們把它叫做platforms它具有的平臺(包括Mac)的所有唯一名稱的列platform_name,則查詢將是:

SELECT platforms.`platform_name`, COUNT(stats.`platform`) FROM `platforms` 
LEFT JOIN `stats` ON platforms.`platform_name` = stats.`platform` 
GROUP BY platforms.`platform_name` 
+0

+1 JOIN' –