2011-01-21 3 views
0

Я пробовал эту работу в течение 24 часов, и теперь мне кажется, что я близок к ней!Проблема с представлением данных из SQL с несколькими циклами

Я хотел бы получить дату (колонка: ИГД) и местоположение (колонка PLATS) из MySQL, где мой код выглядит как:

<?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>"; 
} 

?> 

Это дает мне:

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 НЕ хотите дополнительный декабрь, написанный в соответствии с «2010» ...

Я надеюсь, что кто-то может помочь, потому что я потерялся в своем собственном коде xD спасибо!

ответ

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

Вау, гораздо лучший код! Я не знал, что можно было разделить дату вроде этого и «упорядочить» более чем 1 «столбец» в SQL-коде ... Теперь я понял ... Я еще не тестировал код, но я guess $ stmt должен быть $ result, а переменные $ result-variables в цикле должны быть $ row right? Благодаря! – 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

Спасибо! Я думаю, что буду придерживаться кода Ксавье, потому что он более эффективен (меньше символов)! – Robin

Смежные вопросы