2009-08-14 12 views
0

私はユーザーのイベントの読み取り専用の毎週カレンダービューを作成しています。 列は曜日です(月>日) 行はタイムスロットです(8:00> 9:00、9:00> 10:00 ...午前8時から午後7時)は、mysql/phpの週刊カレンダーを生成します

質問:そのユーザーカレンダーを生成するための最良の方法:

オプション1:純粋なSQL それは可能かどうかわかりませんが、それは最高のエレガントさを見つけるでしょう:mysqlが7列(日) 11行(タイムスロット)に分割され、各タイムスロットに対してサブクエリがあり、そのタイムスロット/ユーザに対してミーティングが予約されているかどうかがチェックされます。

オプション2:php/mysql mysqlはbooked/userの会議を検索して、PHPで生成されたカレンダーでそれを渡します。

オプション1はすべて可能ですか?そうであれば、それはリソース集約型ですか?

は、 アレクサンドル

UPDATEありがとう:ここにクエリ候補

を私が予約したイベント(:ユーザーが教師である。この場合のレッスン)を取得するために使用する「オプション2」クエリです。

SELECT DISTINCT date, hour_from, hour_to, courses.description, courses.alias, teachers.name, locations.new_acronym 
     FROM timetables 
     INNER JOIN courses ON (courses.id=timetables.course_id) 
     INNER JOIN teachers ON (teachers.id=timetables.prof_id) 
     INNER JOIN locations ON (locations.id=timetables.location_id) 
     WHERE ((timetables.prof_id='$id') 
      AND (timetables.date >= '$starting_date') 
      AND (timetables.date < date_add('$starting_date', INTERVAL 7 day))) ; 

オプション1を有効にするクエリについては、非常に興味があります。

+0

クエリのsuggetionsが必要な場合は、descテーブルを追加し、i(私たち)が投稿します。 –

+0

はそれに応じて質問を更新しました。ありがとうございました。 – pixeline

答えて

2

カレンダーをSQLテーブルとして記述しようとすると、うまく一致しないように聞こえます。確かに、7列11行のテーブルを生成するクエリを実行することは可能ですが、生成されたテーブルでは何をしますか? PHPを使用してレンダリングする必要があります。

まず、PHPがカレンダーを描画していることを前提にして、事前にSQLを生成する余分な作業を省いてください。この方法で、単一のSQLクエリを使用して、ワンショットで表示する必要があるすべてのイベントを取得し、それを描画するときにカレンダーに配置できます。

0

私はそのようなことをしました。私は7列11行のテーブルは非常に悪い解決策だと思います。

すべての "イベント"を保存して、それをPHPでレンダリングする1つのテーブル。あなたはカレンダーをもっと柔軟にすることができます(1日のうちに時間を増やしたい場合や、ビルドすれば半分の時間を使うことができます)。

あなたがまだオプション1を選択している場合: 私はそれが非常にリソース集約的だとは思っていません。そして、あなたはそのようなものをキャッシュすることができないので難しくないと思います。

+1

私は、彼が "mysqlがテーブルを生成する"と言ったときにOPのSELECTクエリの結果を設定すると思います。したがって、別のタイムスロットを置くと、query'llは自動的にさらに多くの行を追加します。 –

+0

私の質問は、データベースの設計についてではなく、予約されたイベントで満たされたタイムスロットで完結した週間カレンダーを返す選択されたクエリについてです。私はhtmlテーブルをレンダリングするためにPHPで単純なループを解析するだけです。 – pixeline

0

私は推測していますが、タイムスロットを使用してテーブルを作成するとオプション1を実行できると思います。これは、多くのクエリを簡素化します。また、カレンダーページを生成するPHPコードはもっと簡単になります。結果セットを反復処理するだけで済みます。 そして、良いパフォーマンスを得るには、適切なインデックスとキーを作成する必要があります(事前に提案することはできません)。

提案を追加、編集: @pixeline:あなたはテーブルレイアウトを追加didntのため、これは、暗所での撮影で、BU私はあなたがそれを行うだけでLEFT OUTER JOININNER JOIN Sを変更すると思う:

SELECT DISTINCT date, hour_from, hour_to, courses.description, courses.alias, teachers.name, locations.new_acronym 
    FROM timetables 
    LEFT OUTER JOIN courses ON (courses.id=timetables.course_id) 
    LEFT OUTER JOIN teachers ON (teachers.id=timetables.prof_id) 
    LEFT OUTER JOIN locations ON (locations.id=timetables.location_id) 
    WHERE ((timetables.prof_id='$id') 
     AND (timetables.date >= '$starting_date') 
     AND (timetables.date < date_add('$starting_date', INTERVAL 7 day))) ; 

timetablesに1日の時間がない場合は、それらのテーブルを作成して(たとえばtimeslot)、それを最初のテーブルとして入れて、LEFT OUTER JOINまたはCROSS JOINとして時刻表を入れることができます。上記のように他のものはLEFT OUTER JOINとなります。

+0

実際、イベントはテーブルに格納され、タイムスロットは別のテーブルに格納されます。私は古典的な "その週のこのユーザーのすべてのイベントを取得する"クエリの罰金を得た。私は毎週のタイムスロットをループするPHPを見つけて、これらの結果との一致が非常に複雑であることを知っています。そのため、賢明なmysqlクエリでは、カレンダーを返すことができます。 – pixeline

関連する問題