2011-01-21 7 views
0

24 시간 동안이 작업을 수행하려고 시도했지만 이제는 필자가 가깝다고 느낍니다.다중 루프를 사용하여 SQL에서 데이터를 표시 할 때 문제가 발생했습니다.

2011 
Jan 
1. Location 
2. Location 
3. Location 
... 

Feb 
1. Location 
2. Location 
3. Location 
... 
... 
Dec 
1. Location 
2. Location 
3. Location 
... 

2010 
Dec 

Jan 
1. Location 
2. Location 
3. Location 
... 
Feb 
1. Location 
2. Location 
3. Location 
... 
... 
Dec 
1. Location 
2. Location 
3. Location 
... 

I을 :

<?php 

$sql = "SELECT datum FROM gigs GROUP BY DATE_FORMAT(datum, '%Y') ORDER BY datum DESC"; 
$result = mysql_query($sql); 

while($r = mysql_fetch_array($result)) { 

    $date = $r['datum']; 
    $date_new = new DateTime($date); 
    $year = $date_new->format('Y'); 
    $month = $date_new->format('M'); 
    $day = $date_new->format('d'); 

    $sql2 = "SELECT * FROM gigs WHERE DATE_FORMAT(datum, '%Y') = $year ORDER BY datum ASC"; 
    $result2 = mysql_query($sql2); 

    echo "<tr height=20px><td></td><td align=center><b>".$year."</b></td></tr>"; 

    echo "<tr><td><b>".$month."</b></td></tr>"; 

    while($r2 = mysql_fetch_array($result2)) { 

    $date2 = $r2['datum']; 
    $date_new2 = new DateTime($date2); 
    $year2 = $date_new2->format('Y'); 
    $month2 = $date_new2->format('M'); 
    $day2 = $date_new2->format('j'); 

//echo "<b>Month: ".$month."</b>"; 
//echo "<b>Month2: ".$month2."</b>"; 

    if($month != $month2) { 
    echo "<tr><td>&nbsp;</td></tr><tr><td><b>".$month2."</b></td></tr>"; 
    } 

    $month = $month2; 

    echo "<tr class=giglist><td>".$day2."</td><td>".$r2['plats']."</td></tr>"; 



    } 
    echo "</td></tr>"; 
} 

?> 

이 나에게주는 : 내 코드처럼 보이는 MySQL의에서 (plats입니다 열) 및 위치 :

나는 날짜 (자료 열)을 좀하고 싶습니다 "2010"아래에 쓰여진 여분의 12 월을 원하지 마라.

누군가 내가 도울 수 있기를 바란다.

답변

1

귀하의 코드를 훨씬 복잡한에, 당신은 하나 개의 쿼리,

<?php 
$sql = 'SELECT 
      *, 
      DATE_FORMAT(datum, "%Y") "year", 
      DATE_FORMAT(datum, "%M") "month", 
      DATE_FORMAT(datum, "%e") "day" 
     FROM gigs 
     ORDER BY year DESC, month DESC, day ASC'; 

$year = null; 
$month = null; 
$stmt = mysql_query($sql); 
while($row = mysql_fetch_array($result)) { 
    if ($year != $result['year']) { 
     // Year changed 
     $year = $result['year']; 
     echo "<tr height=20px><td></td><td align=center><b>".$year."</b></td></tr>"; 
    } 
    if ($month != $result['month']) { 
     // Month changed 
     $month = $result['month']; 
     echo "<tr><td>&nbsp;</td></tr><tr><td><b>".$month."</b></td></tr>"; 
    } 
    echo "<tr class=giglist><td>".$result['day']."</td><td>".$row['plats']."</td></tr>"; 
} 
+0

원본 코드보다 훨씬 좋아 보이지만 원본 코드의 의도가 맞다면 잘못된 순서로 인쇄됩니다. 당신은 그 해가 오름차순으로, 그리고 그 다음에 오름차순으로 달 (그리고 일)을 주문해야합니다. – kastermester

+0

당신은 절대적으로 옳습니다. 쿼리를 수정합니다 –

+0

와우, 훨씬 좋은 코드! 나는 그것과 "순서"에 의해 SQL 코드에서 1 개 이상의 '열'과 같은 날짜를 분할하는 것이 가능하다는 것을 몰랐다 ... 지금 나는 그것을 얻는다 ... 나는 아직 코드를 테스트하지 않았지만 $ stmt가 $ result가되어야하고 $ result-variables가 $ row이어야합니다. 감사! – Robin

0

먼저, 제발 제발, 제발 관심 원칙의 분리를 사용하시기 바랍니다! 템플릿 시스템을 사용하십시오. Smarty, http://www.smarty.net/ 및 데이터베이스 추상화 계층을 사용하십시오. 그러면 코드가 훨씬 더 유연하고 읽기가 쉬워 질 것입니다. 그런 다음이 질문을 할 필요가 없으며 많은 시간을 절약 할 수 있습니다.

이것은 말하기를, 당신은 이것을 시도 할 수있었습니다 (나는 그것을 테스트하지 않았습니다 ..);

<?php 

$sql = "SELECT datum FROM gigs GROUP BY DATE_FORMAT(datum, '%Y') ORDER BY datum DESC"; 
$result = mysql_query($sql); 

while($r = mysql_fetch_array($result)) 
{ 
    $date = $r['datum']; 
    $date_new = new DateTime($date); 
    $year = $date_new->format('Y'); 
    $month = $date_new->format('M'); 
    $day = $date_new->format('d'); 

    $sql2 = "SELECT * FROM gigs WHERE DATE_FORMAT(datum, '%Y') = $year ORDER BY datum ASC"; 
    $result2 = mysql_query($sql2); 

    echo "<tr height=20px><td></td><td align=center><b>".$year."</b></td></tr>"; 
    $first_month_printed = false; 

    while($r2 = mysql_fetch_array($result2)) 
    { 
     $date2 = $r2['datum']; 
     $date_new2 = new DateTime($date2); 
     $year2 = $date_new2->format('Y'); 
     $month2 = $date_new2->format('M'); 
     $day2 = $date_new2->format('j'); 

     if($month != $month2) { 
      echo "<tr><td>&nbsp;</td></tr><tr><td><b>".$month2."</b></td></tr>"; 
     } else if (!$first_month_printed) 
      echo "<tr><td>&nbsp;</td></tr><tr><td><b>".$month2."</b></td></tr>"; 
      $first_month_printed = true; 
     } 

     $month = $month2; 
     echo "<tr class=giglist><td>".$day2."</td><td>".$r2['plats']."</td></tr>"; 
    } 

    echo "</td></tr>"; 
} 

?> 
+0

감사합니다이 코드를 볼 수 있다고 할 수있다! 더 효과적이기 때문에 Xavier 코드를 고수 할 것입니다! – Robin

관련 문제