2012-03-22 5 views
1

ニュースシステムのナビゲーションを改訂しており、最小限のMySQLクエリを使用したいと考えています。私はそれを1つのクエリにすべてダウンさせることができましたが、何かが間違っているようです。どんな助けでも大歓迎です。私は非常に近いですPHPで階層的にソートされたMySQL出力

2012 
--04 (3) 
--02 (1) 
--01 (1) 
2011 
--12 (3) 
--11 (2) 
--10 (3) 
--09 (1) 
--07 (1) 
--02 (1) 

:私が達成したい何

は(文字通り)のイベントの以下の概要、階層的にその月のイベントの数と一緒に、年と月ごとにソートされます。

SELECT start_date, date_format(start_date, "%Y") as year, date_format(start_date, "%m") as month FROM event ORDER BY start_date desc 

その後、私のPHPループは次のとおりです。次のように私のクエリがあり、常に1行であるように思わ月あたりのイベントの数を除いて、完全にすべてのものを生成

$year   = ''; 
    $year_counter = 0; 
    $month  = ''; 
    $month_counter = 1; 
    while($row = mysql_fetch_assoc($result)){ 
     if ($year != $row['year']) { 
      $year = $row['year']; 
      $output .= $year.'<br />'; 
     } 
     if ($month == $row['month']) { 
      $month_counter++; 
     } else { 
      $month = $row['month']; 
      $output .= '--'.$month.' ('.$month_counter.')<br />'; 
      $month_counter = 1; 
     } 
    } 

オフ(上記の希望結果との違いをご覧ください)。

2012 
--04 (1) 
--02 (3) 
--01 (1) 
2011 
--12 (1) 
--11 (3) 
--10 (2) 
--09 (3) 
--07 (1) 
--02 (1) 

私はこの午後すべてを成功させずに修正しています。私はそれを絶対的な専門家に任せておくことが最善だと思います。どうかお元気ですか?あなたの

$month = $row['month']; 

+0

年式の中に月のループを配置するとどうなりますか? –

+0

これを行うと、毎年の最初の月のみが表示されます... – maartenmachiels

答えて

1

のようなもの、あなたが印刷しているの年、月ごとのイベントやグループにそれらを数えることができますあなたが次の月にそれを更新する前にmonth_counter。 whileループの前に、デフォルト値ではなく最初に取得された行に基づいて変数を初期化する必要があります。

if ($row = mysql_fetch_assoc($result){ 
    $year = $row['year']; 
    $month = $row['month']; 
    $month_counter = 1; //1 because you've already counted the first article 
    // print out the first year 
    $output .= $year.'<br />'; 
    while($row = mysql_fetch_assoc($result){ 
     if ($year != $row['year']) { 
      $year = $row['year']; 
      $output .= $year.'<br />'; 
     } 
     if ($month == $row['month']) { 
      // You've found one more article for this month, so increment the count 
      $month_counter++; 
     } else { 
      // You've hit a new month, so print out the information you collected 
      // about the previous month 
      $output .= '--'.$month.' ('.$month_counter.')<br />'; 
      $month = $row['month']; 
      $month_counter = 1; 
     } 
    } 
} 

月年を出力し、出力の違いは、年に関連した追加情報はありません一方、あなたはまた、出力に月に関連付けられたカウントをしたいということです。あなたは翌月に変更する前に印刷する必要があります。

+0

ありがとうございますが、予期せぬ結果が出ます... 2012年の最初の月(つまり04)がありません... – maartenmachiels

+0

申し訳ありませんが、elseブロックで$ output = $と切り替える必要があることを忘れてしまいました。 – aelfric5578

+0

こんにちは、私は正しく理解しているかわかりません。なぜなら、これをelseブロックに入れると、スクリプトには年しか表示されないからです。変数の出力にはすべてが含まれていて、スクリプトの最後に返されます。 – maartenmachiels

1

は間違った場所にあります。それは新しい月の$ month変数を設定しますが、その前の月の数を数えています。

それはwhileループを通る初めて

if ($month == $row['month']) 
それは月とあなたがそれを設定しているため1でカウント(表示、それ以外の文の中に入るよう

は、真なることはありませんトップ)で1 ...

+0

最初のif文で$ month-variableを設定する必要があります; – snaderss

+0

ありがとうございます。 (年のステートメント)、2012年の最初の月(4)が欠落しています。あなたはもう少し洞察力を提供していただけますか? – maartenmachiels

0

私はおそらくここにいくつかのミスを犯したが、あなたはそれに応じて...現在

SELECT start_date, date_format(start_date, "%Y") as year, date_format(start_date, "%m") as month, date_format(start_date, "%Y%m") gr, COUNT(id) 
FROM event 
ORDER BY start_date desc 
GROUP BY gr 
関連する問題