Grup PHP Kullanımı ve hafta MySQL girişleri görüntülemek

3 Cevap php

Ben birkaç 'tek gömlekleri' ile bir site inşa ediyorum. Bunlar MySQL 5 veritabanında depolanan basit PHP5 formu kullanılarak eklenir. Her satır bir 'id' (auto_increment) vardır, 'title', 'açıklama', 'status' (1 veya 0) ve 'date_added' (MySQL datetime).

Ben onları çok gibi, Ay ve Yıl göre gruplandırılmış görüntülemek istiyorsanız:

<dl>
    <dt>August 2009</dt>
    <dd><strong>title 1</strong> - description 1</dd>
    <dd><strong>title 2</strong> - description 2</dd>
    <dd><strong>title 3</strong> - description 3</dd>         
    etc...
</dl>
    <dl>
    <dt>July 2009</dt>
    <dd><strong>title 1</strong> - description 1</dd>
    <dd><strong>title 2</strong> - description 2</dd>
    <dd><strong>title 3</strong> - description 3</dd>         
    etc...
</dl>

Ben, ancak sorgu yalnızca yerine tam tablo daha, sonuçların birkaç döner ay göstermelik gruplar satırlar bir MySQL parçacık bulundu:

SELECT `title`, `description`, `date_added`
FROM one_liners WHERE `status`=1 GROUP BY MONTH(date_added)

Onları nasıl gruplama, ve sonra yukarıdaki gibi göstermek için döngü hakkında gitmek istiyorsunuz?

Herhangi bir yardım büyük mutluluk duyacağız.

Teşekkürler!

3 Cevap

Bunun için GROUP BY tümcesi kullanmak istemiyorum. Ne istediğinizi gibi "sesler" olsa da, tamamen farklı etkileri vardır.

Normal bir sorguyu çalıştırın:

SELECT `title`, `description`, `date_added` FROM one_liners 
WHERE `status`= 1 ORDER BY `date_added`

Sonra döngü sonuçları, böyle bir şey yapıyor:

$query = 'SELECT `title`, `description`, `date_added` FROM one_liners WHERE `status`= 1 ORDER BY `date_added`';
$res = mysql_query( $query );
$month = null;
$year  = null;

echo '<dl>';
while($row = mysql_fetch_assoc( $res ){
  $r_month = strtotime( $row['date_added'] );
  if($month != date('m', $r_month) || $year != date('Y', $r_month)){
     echo '<dt>' . date('F Y', $r_month) . '</dt>';
     $month = date('m', $r_month);
     $year  = date('Y', $r_month);
  }
  echo '<dd><strong>' . htmlentities( $row['title'] ) . '</strong> &mdash;' . htmlentities( $row['description'] ) . '</dd>';
}
echo '</dl>';

I specifically chose to use only one dl, çünkü dl çok dd tutmak gerekiyordu ve dt unsurları, liste başı sadece bir çift. Eğer :) katılmıyorum eğer gerektiği gibi benim kod ayarlamak için çekinmeyin

Ben yalnız PHP bunu yapmak gerekir düşünüyorum. Grup-by SQL genellikle Bu PHP erişebilirsiniz gruplaşmanın çeşit göstermek için ayarlanmış asıl kayıt şey yapmaz vb SUM, AVG, MAX, MIN, COUNT, gibi şeyler için kullanılır.

Ben bu gibi durumlarda yaptık ben yeni bir grup olsun bilmek döngü içinde birlikte izlemek için bir değişkendir. Lütfen SQL için yapmanız gerekir:

SELECT `title`, `description`, `date_added`
FROM one_liners WHERE `status`=1 ORDER BY MONTH date_added DESC

Sonra PHP yapmanız gerekir:

$prevMonth = '';
while ($row = mysql_fetch_assoc($result)) {
    $currMonth = $row['date_added'];
    if ($currMonth != $prevMonth) {
        if ($prevMonth != '') {
            echo '</dl>';
        }
        echo '<dl><dt>' . $currMonth . '</dt>';
        $prevMonth = $currMonth;
    }
    echo '<dd><strong>' . $row['title'] . '</strong>';
    echo ' - ' . $row['description'] . '</dd>';
}
if (mysql_num_rows($result) > 0) {
        echo '</dl>';
}

Tüm bu gerçekten aracılığıyla döngü olarak önceki satırdan ayın takip yapıyor. Eğer yeni bir olsun zaman eski DL kapatmak ve yeni bir açılacak.

Eğer DB (datetime vs timestamp) daki tarihleri ​​depolamak nasıl bağlı olarak format "Ağustos 2009" ya da ne istersen onu dönüştürmek için uygun kodu ile $currMonth = $row['date_added']; değiştirmeniz gerekir.

Sen GROUP BY Orada kullanarak istemiyorum, bunun yerine ORDER BY kullanmayı deneyin.