2017-09-27 17 views
0

MySQLデータベースがあり、多くのイベント(コンサートなど)を含むテーブルがあります。テーブルの構造は非常に単純です:PHP MySQLは日付を取得し、毎月JSONにデータを分割します

January 
- event blabla 10/01/17 
- event thisandthat 17/01/17 

February 
- event something 05/02/17 
- event another something 13/02/17 

...etc etc 

id (int, 11, pk , ai) 
event_name (varchar, 255) 
event_location (varchar, 255) 
event_date (date) 

さて、フロントエンドの表示目的のために、私は次のように、「月の概要」のいくつかの種類のイベントを表示したいと思いますだから私はこれを達成する方法を考えていた。別のテーブルを作成して、任意の月にIDを与え、イベントテーブルに「month_id」フィールドを追加する必要がありますか?

json_encodeとしたいので、最後にすべてのデータを持つオブジェクトでJSON配列を作成します。

提案がありますか?またはそれ以上:どのような例ですか?

** UPDATE **

マイ所望の結果は次のようなものになります。そして、event_monthは(最初のループ)nullの場合、比較結果をforeachループに入る

[{ 
    "January": [{ 
      "event_name": "blabla", 
      "event_location" : "somewhere", 
      "event_date": "2017-01-10" 
     }, 
     { 
      "event_name": "blabla", 
      "event_location" : "somewhere", 
      "event_date": "2017-01-17" 
     } 
    ] 
}, 
{ 
    "February": [{ 
      "event_name": "blabla", 
      "event_location" : "somewhere", 
      "event_date": "2017-02-10" 
     }, 
     { 
      "event_name": "blabla", 
      "event_location" : "somewhere", 
      "event_date": "2017-02-17" 
     } 
    ] 
}, 
{ 
    "March": [{ 
      "event_name": "blabla", 
      "event_location" : "somewhere", 
      "event_date": "2017-03-10" 
     }, 
     { 
      "event_name": "blabla", 
      "event_location" : "somewhere", 
      "event_date": "2017-03-17" 
     } 
    ] 
    } 
] 
+0

あなたはEVENT_DATE、ORDER BYことができますが、推奨される 'YYYY-MM-DD'フォーマットを、必要があるでしょう。 – AbraCadaver

+1

これを実行する方法は数多くあります。日付順に並べ替えることをお勧めします。その結果をストリーミングするときは、その月を指定してJSONを作成する構造で使用します(月単位)。 – hakre

答えて

0
$sql="SELECT MONTH(event_date) event_month, * FROM events ORDER BY event_date"; 

をか前のループと同じです。月イベントのサブセットに同じ場合は、新しい月が始まります。

$currentmonth=null; 
for($row in $rows){ 
    if($row["event_month"]!=$currentmonth){ 
     echo "Month ".$row["event_month"]; 
     $row["event_month"]=$currentmonth;  
    } 
    echo "\tevent ".$row["event_name"]; 
} 
+1

どの日付でも1ヶ月後に来るので、 'event_date'による注文で十分です(MONTH関数をORDER BY句に入れておくことができます)。 – hakre

+0

あなたは正しいです!私はそれを削除します。 – Tobia

+0

もう1つのヒント: 'event_date'列に基づいてループ内の結果行から比較値を作成すると、配列キーを作成してJSON応答を非常に簡単に作成することができます。これはまた、データ処理をアウトプアと分けるためにも解決しますが、これは少しのメモリを必要としますが、全体的に少し柔軟になります。 – hakre

0

あなたは、あなたのクエリで月あなたのために働くどのような形式で、この

SELECT event_name, event_location, event_date, 
     DATE_FORMAT(event_date, '%Y - %M') AS event_month 
WHERE ... 
ORDER BY event_date 

のようなものを先に行くと、抽出することができます。年を含めることは、あなたがそれを使って何をしているかに応じて、役に立つかもしれません。含まれる年が必要ない場合は、代わりにMONTHまたはMONTHNAMEを使用できます。

次に、クエリ結果から行をフェッチするときにそれをグループ化します。

<?php 

while ($row = $stmt->yourFavoriteFetchMethod()) { 
    $result[$row->event_month][] = $row; 
} 

echo json_encode($result); 
+0

ええと、これは各オブジェクトに年と月だけを追加します... – Steve

+0

クエリはそれを追加しますが、グループ化は '$ result [$ row-> event_month] []それはあなたのために働いていないのですか? –

関連する問題