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会强制一切(所有字段)都是时间戳 - 我想它会给你一个错误 –