2012-10-19 25 views
2

這幾天我一直在處理這個項目。我不知道這段代碼的錯誤是什麼,我應該用什麼方法讓我的代碼更好,我的朋友告訴我應用數組,但我不熟悉那種方法,我試圖在幾天內研究和研究,但它不工作。我需要的是製作一個計算1,2,3,4和5級的程序,並顯示例如在1月,2月,3月,5月,5月,6月,6月,8月有多少數據(行) ,sep,oct,nov和dec,在這個示例代碼中,我只顯示過濾級別5,因爲我不想讓這個讀者感到困惑。感謝你們 :-(使用php和mysql進行數據過濾

這是我的樣品臺

Table: sample 
+-------------+------------------+-----------+ 
| date  |  level  | id  | 
+-------------+------------------+-----------+ 
| 2012-03-01 |  4   |  1  | 
| 2012-02-02 |  1   |  2  | 
| 2012-04-03 |  4   |  3  | 
| 2012-05-14 |  1   |  4  | 
| 2010-01-05 |  5   |  5  | 
| 2009-01-05 |  2   |  6  | 
| 2008-01-05 |  3   |  7  | 
| 2012-02-02 |  1   |  8  | 
| 2012-06-03 |  4   |  9  | 
| 2012-07-14 |  1   |  10 | 
| 2010-01-05 |  5   |  11 | 
| 2009-01-05 |  2   |  12 | 
| 2012-08-05 |  3   |  13 | 
+-------------+------------------+-----------+ 

此查詢按日期選擇了2012年和訂單的所有數據

$query = mysql_query("select * from table where year(date)='2012' order by date"); 

This while loop gene評價$ query所喜歡的所有記錄。在循環中有HOPING條件,它用全部5個LEVEL過濾記錄...當數據(由$ query生成)是5級時,$ level5將增加1,然後該數據將轉到另一個if語句確定數據(由$查詢生成)屬於哪個月,假設數據是2012-05-14,那麼數據將在if語句中進行if(Date_format($ ii ['date'],'%m')) )== 05)和1,之後增加了$ level5_may ...

while($ii=mysql_fetch_array($query)) 
{ 
if($ii['level']==5) 
{ 
$level5++; 
    if(Date_format($ii['date'],'%m'))==1) 
    { 
    $level5_jan++; 
    }elseif(Date_format($ii['date'],'%m'))==02) 
    { 
    $level5_feb++; 
    }elseif(Date_format($ii['date'],'%m'))==03) 
    { 
    $level5_mar++; 
    }elseif(Date_format($ii['date'],'%m'))==04) 
    { 
    $level5_apr++; 
    }elseif(Date_format($ii['date'],'%m'))==05) 
    { 
    $level5_may++; 
    }elseif(Date_format($ii['date'],'%m'))==06) 
    { 
    $level5_jun++; 
    }elseif(Date_format($ii['date'],'%m'))==07) 
    { 
    $level5_jul++; 
    }elseif(Date_format($ii['date'],'%m'))==08) 
    { 
    $level5_aug++; 
    }elseif(Date_format($ii['date'],'%m'))==09) 
    { 
    $level5_sep++; 
    }elseif(Date_format($ii['date'],'%m'))==10) 
    { 
    $level5_oct++; 
    }elseif(Date_format($ii['date'],'%m'))==11) 
    { 
    $level5_nov++; 
    }elseif(Date_format($ii['date'],'%m'))==12) 
    { 
    $level5_dec++; 
    } 
} 
} 

的這部分代碼現在將收集的if語句

結果0
echo" 
number of 5 stars: $level5 <br> 
jan:$level5_jan  <br> 
feb:$level5_feb  <br> 
mar:$level5_mar  <br> 
apr:$level5_apr  <br> 
may:$level5_may  <br> 
jun:$level5_jun  <br> 
jul:$level5_jul  <br> 
aug:$level5_aug  <br> 
sep:$level5_sep  <br> 
oct:$level5_oct  <br> 
nov:$level5_nov  <br> 
dec:$level5_dec  <br> 
"; 

回答

0
$date = 'date'; 
$level = 'level'; 
$year = '2012'; 

$result1 = mysql_query("SELECT *, DATE_FORMAT($date, '%m') AS monthz FROM sample WHERE year($date) = '$year' ORDER BY $date"); 
while($row=mysql_fetch_array($result1)) 
{ 
$count++; 


    if($row['smi_level']=='5star') 
    { 
     if($row['monthz']==1) 
     { 
     $jan++; 
     }elseif($row['monthz']==2) 
     { 
     $feb++; 
     }elseif($row['monthz']==3) 
     { 
     $mar++; 
     }elseif($row['monthz']==4) 
     { 
     $apr++; 
     }elseif($row['monthz']==5) 
     { 
     $may++; 
     }elseif($row['monthz']==6) 
     { 
     $jun++; 
     }elseif($row['monthz']==7) 
     { 
     $jul++; 
     }elseif($row['monthz']==8) 
     { 
     $aug++; 
     }elseif($row['monthz']==9) 
     { 
     $sep++; 
     }elseif($row['monthz']==10) 
     { 
     $oct++; 
     }elseif($row['monthz']==11) 
     { 
     $nov++; 
     }elseif($row['monthz']==12) 
     { 
     $dec++; 
     } 
    } 
} 
echo" $jan $feb $mar $apr $may $jun $jul $aug $sep $oct $nov $dec"; 

這是我的完整的解決方案我的問題(但我對於我的解決方案並不快樂,因爲代碼是鬆散的或散裝的,我還沒有使用數組,所以我是令人失望啊,我自己),感謝對˚F 。Müller爲我提供了有關陣列的想法以及AS*, DATE_FORMAT($date, '%m') AS monthzArun Killu的使用感謝您的建議。我知道我的解決方案代碼不太好,哈哈哈我開放任何建議謝謝

0
select *,count(1) as total from table where year(date)='2012' 
group by level order by date 
1

SQL:

"SELECT level, id, date AS UNIX_TIMESTAMP(date) FROM table WHERE year(date) = '2012' ORDER BY date" 

PHP:

while($row = mysql_fetch_assoc($query)) 
{ 
    $levels = array(); // This is where the data for the monthly counting goes in 
    $currentLevel = $row['level']; // The current level in the loop 
    $currentDate = date('n', $row['date']); // The current month without leading zeroes 

    if ($currentLevel === 5) // Check if the current level equals 5 
    { 
     $levels[$currentLevel][$currentDate] += 1; 
    } 
} 

應該做你想要什麼,但它沒有進行測試。

注:不recommendet使用過程中的多個查詢(性能不好)

編輯

SELECT field1, field2, field3, date AS UNIX_TIMESTAMP(date) FROM table WHERE year(date) = '2012' ORDER BY date) 

或試試這個(不知道這是否正常工作):

SELECT *, date AS UNIX_TIMESTAMP(date) FROM ... 

UNIX_TIMESTAP

如果你的領域是typeof運算時間戳或日期時間UNIX_TIMESTAMP(日期)將在幾秒鐘內自1971年11月(參見:http://en.wikipedia.org/wiki/Unix_time)返回日期和這裏(見:http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_unix-timestamp

使用Unix時間戳這是很容易處理日期 - 你可以很容易地計算出它們並將其格式化爲任何你喜歡的。

+0

虐待測試你的代碼F.Müller –

+0

我可以改變它到這個「SELECT * AS UNIX_TIMESTAMP(日期)從表WHERE年(日期)= '2012'ORDER BY date「 –

+0

不,你不能這樣做,因爲sql會強制一切(所有字段)都是時間戳 - 我想它會給你一個錯誤 –