2012-10-19 2 views
2

이 프로젝트를 진행하는 데 며칠이 걸렸습니다. 나는이 코드의 오류가 무엇인지 알지 못했고 코드를 더 잘 만들려면 어떤 방법을 사용해야하는지, 친구는 배열을 적용하라고했지만 익숙하지 않은 방법으로 며칠 만에 조사하고 연구하려고했지만 작동하지 않았습니다. 내가 필요로하는 것은 1, 2, 3, 4 및 5 레벨을 카운트하고, 얼마나 많은 데이터 (행)가 5, 5, 4, 5 월, 5 월, 5 월, 5 월, 5 월, , 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"); 

이 while 루프 유전자 $ query가 선호하는 모든 레코드를 평가하십시오. 루프에서 HOPING 조건은 모든 5 LEVEL로 레코드를 필터링합니다 ... 데이터 ($ query로 생성)가 레벨 5 일 때 $ level5가 1 씩 증가하고 그 데이터는 다른 if 문으로 이동합니다 ($ query에 의해 생성 된) 데이터가 속한 월을 결정하면 데이터가 2012-05-14라고 가정 해 보겠습니다. 그러면 데이터가 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 감사 내 문제에 관한 것입니다 Muller 배열에 대한 아이디어와 함께 *, 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; 
    } 
} 

당신이 원하는하지만이 테스트되지 않은 상태입니다 무엇을해야합니까.

참고 : (이 제대로 작동하는지 확실하지)는 물론 여러 쿼리 (나쁜 성능)

편집

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

을 사용하거나이 시도 recommendet되지 않습니다

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

UNIX_TIMESTAP

타임 스탬프 또는 날짜 UNIX_TIMESTAMP (날짜) 1971년 11월 (참조 : http://en.wikipedia.org/wiki/Unix_time을)부터 초 단위로 날짜를 반환합니다 대해서 typeof 당신의 분야 인 경우

은 여기 (참조 : http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_unix-timestamp)을 유닉스 타임 스탬프로

이 날짜를 처리하는 것은 매우 쉽습니다 - 원하는 형식으로 형식을 쉽게 계산할 수 있습니다.

+0

아플 테스트 코드 F. Müller –

+0

내가 이것을 "SELECT * AS UNIX_TIMESTAMP (date) FROM table WHERE year (date) = '2012'ORDER BY date " –

+0

아니요. sql이 모든 필드 (모든 필드)를 타임 스탬프로 강제 처리 할 수는 없습니다. 어쨌든 오류가 발생합니다. –