今だけ人気マンガ100円レンタル特集♪

MYSQLで部屋を利用するための予約システムを作ろうと考えております。

設計として下記を考えてみたのですがおかしいでしょうか。

要件は下記のとおりです。
・A、B、C3つの部屋の利用予約を時間単位でおこなう
・重複する時間は予約できない
・日を跨ぐ予約はできない

テーブル設計
トランID(int)|開始時刻(datetime)|終了時刻(datetime)|部屋ID(int)

時間についてはdatetime式で2013-03-22 12:00:00 と保存させる予定です。

入力を簡素にするため、時刻は時、分個別のプルダウンで30分刻みにしようと考えています。

そこで分からなくなってきたのがデータ保持の方法なのですが、
例えば10:00-12:00と予約入力された場合、datetime式ですと秒まで保存されますので
2012-03-22 10:00:00 - 2012-03-22 12:00:00 となりますよね。

そうなりますと、別の予約で12:00-15:00を確保したい場合、開始時刻は重複してしまうことに
なりますので、テーブルには2013-03-22 10:00:01 - 2013-03-22 11:59:59と登録したほうが
いいのでしょうか。
ただ、これだと時間を変更したい場合の修正の際に困ったことになりそうです。

またこの設計の場合、 開始時刻と終了時刻が他の予約と重複していないかのSQLを
考える場合、非常にやっかいなような気がしてきました。

何か別のよい設計のヒントがあればご教授願えないでしょうか。

宜しくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

普通(かどうかは知りませんが)こういう要件のときは、



部屋ID=A

'2013-03-22 11:00:00'
から
'2013-03-22 15:00:00'
と画面で入力されたとすると、

SELECT count(*) FROM 予約テーブル
WHERE 部屋ID=A
AND 開始時刻<'2013-03-22 15:00:00'
AND 終了時刻>'2013-03-22 11:00:00'

の結果が0でなければ重複しているとしてエラーにします。
00:00は含まれないので、データの持ち方は、00分00秒でOKです。

なにをやっているかの補足:
AND 開始時刻<'2013-03-22 15:00:00'
は、開始時刻が入力した終了時刻以降のものは関係ありません。
(今回の予約時間が終わってから始まります。)
AND 終了時刻>'2013-03-22 11:00:00'
は、終了時刻が入力した開始時刻以前のものは関係ありません。
(今回の予約時間が始まる前に終わってます。)
⇒上記以外とは、今回の予約時間が終わる前に始まり(今回の予約開始前か予約開始後かは問わない)
今回の予約時間が始まる前には終わっていない(今回の予約終了後か予約終了前かは問わない)
予約が既にあるということを調べています。
    • good
    • 0
この回答へのお礼

ありがとうございます!

なるほど、そういう発想で検索すればよかったのですね。
目からウロコです。
確かにそれでいけます!

自身の論理思考の足りなさが恥ずかしい限りです・・。

お礼日時:2013/03/23 01:13

さらに指定時刻(開始)と指定時刻(終了)の間に含まれる開始終了時刻も対象にする必要があるでしょう

    • good
    • 0
この回答へのお礼

何度もありがとうございます!

ご指摘のとおり、BETWEENですと確かにそのようになってしまいました・・。
秒を00でなく30と入れてしまえばBETWEENでも何とかなりそうですが・・。

だんだん頭が混乱してきました!

お礼日時:2013/03/23 01:09

BETWEENでは常に以上・以下での比較になってしまい、入力開始時刻が終了時刻に一致するだけのものも対象になってしまうのでは?


それよりも、開始時刻同士の一致のみと終了時刻同士の一致のみを条件に含めば開始・終了が両方一致のものも含まれます
~(指定時刻(開始)が開始時刻以上で終了時刻より小) OR (指定時刻(終了)が開始時刻より大で終了時刻以下)
    • good
    • 0

>1.2.の問い合わせで件数が0でしたら重複なしと判断できるのですが、


>いちいち2回の検索をおこなうのもどうなのでしょうか。

ORでつないで1回で検索すれば?
~指定時刻(開始)が開始時刻と終了時刻の間 OR 指定時刻(終了)が開始時刻と終了時刻の間
    • good
    • 0
この回答へのお礼

ふたたびありがとうございます。

なるほど、ORを使えばよかったんですね。

しかし、先ほどのSQLですと別の予約を完全に跨いでしまう時間が入力された場合にはヒットしないことに気づきました。
そこで、ORとbetweenを使ってまた考えてみました。

SELECT * FROM 予約テーブル WHERE 部屋ID=A AND ( 開始日時 BETWEEN '2013-03-22 11:00:00' AND '2013-03-22 15:00:00' OR 終了日時 BETWEEN '2013-03-22 11:00:00' AND '2013-03-22 15:00:00')

理論的にはこれで合っていますでしょうか。

お礼日時:2013/03/22 23:11

開始時刻のほうの秒だけを常に00秒より大きな値にして設定すれば?


たとえば常に30秒に設定すれば10:00-12:00と12:00-15:00は10:00:30-12:00:00と12:00:30-15:00:00なので重複しませんし、設定時間の変更時に参照しても分単位での値は元の指定値と同じです
あるいは重複確認を値の一致ではなく大小比較で行うことで、時間帯の重複しない開始・終了時刻の一致は重複とみなさないことも可能
    • good
    • 0
この回答へのお礼

ありがとうございます!
秒についてはそのようにすれば、確かに入力時の分にも影響ありませんね。

重複確認についてはお教えいただいた大小比較で2回のselect分を発行する方法を考えました。

1.入力された開始時刻が重複していないか
SELECT * FROM 予約テーブル WHERE 部屋ID=A AND (開始時刻<'2013-03-22 11:00:00' AND 終了時刻>'2013-03-22 11:00:00')

2.入力された終了時刻が重複していないか
SELECT * FROM 予約テーブル WHERE 部屋ID=A AND (開始時刻<'2013-03-22 15:00:00' AND 終了時刻>'2013-03-22 15:00:00')

1.2.の問い合わせで件数が0でしたら重複なしと判断できるのですが、
いちいち2回の検索をおこなうのもどうなのでしょうか。

お礼日時:2013/03/22 22:24

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QPHPで病院の予約システム作成

PHPで病院や美容院の予約システムを作りたいのですが、何か参考にできる書籍やフリーのプログラムはないでしょうか?
機能としては
 ・ログイン機能
 ・会員登録
 ・時間予約
 ・メニュー(科別)予約
 ・予約参照
 ・予約メール配信機能
等です。

Aベストアンサー

phpScheduleIt
オープンソースです。
http://sourceforge.net/projects/phpscheduleit/files/
http://home.s00.itscom.net/osf/sche_about.html

Q予約システムを作りたい

いつもお世話になります。
この度仕事で予約システムを製作することになりました。
以下のようなサイトのシステムを製作したいのですが、
使用と致しましては、予約可能な◎や○に関してはリンクが
貼られ、クリックすると予約フォームに飛ぶ仕様にしたいと
思っております。PHPはまだまだ初心者も同然なのですが
どうぞ、ご指導・ご意見のほどよろしくお願いいたします。
参考サイト
http://www.w-mama.net/reser.php

Aベストアンサー

データベースに関する知識はお持ちですか?
ファイルにデータを書き込んで…というのでも出来るには出来ます。が、相当大変ですし、バグも多くなる事だと思います。
知識をお持ちで無いのであれば、まずはデータベースに関する知識を得る所から始めると良いかと思います。
「PHP データベース」などで検索してみて下さい。

全体の流れとして、私であればこういった流れを作ります。あくまで参考として。

*予約が可能である、という状態を定義する。それをデフォルトとして、例外の場合も定義する。
例:予約件数が10件以上は不可能。毎週水曜日は不可能。その他に、特別な理由で不可能な日がある。現時点では、貸し切り、祝日、その他、 としておく。後から追加する事も可能。

*コードの流れを考える。( 流石にこの辺りは考えて下さいね。 )

*データベースの仕様( テーブルの要素やテーブル同士の結びつき等 )を設計する。
例:データベースは一つ。テーブルは5つ。テーブル1は日にち毎の例外を管理するテーブル。テーブル2は時間帯ごとの例外を管理するテーブル。テーブル3は状態の内容を管理するテーブル。テーブル4は予約のデータを管理するテーブル。テーブル5は施術の内容を管理するテーブル。
内容は以下の様にする

テーブル1 - dayexp_table
id(unsigned INT key auto_increment) year(unsigned INT) month(unsigned INT) day(unsigned INT) exp(unsigned INT) systime(TIMESTAMP)

テーブル2 - timeexp_table
id(unsigned INT key auto_increment) time_start_h(unsigned INT) time_start_m(unsigned INT) time_end_h(unsigned INT) time_end_m(unsigned INT) exp(unsigned INT) systime(TIMESTAMP)

テーブル3 - expmessage_table
id(unsigned INT key auto_increment) message(VARCHAR 256)

テーブル4 - reservation_table
id(unsigned INT key auto_increment) username(VARCHAR 256) useremail(VARCHAR 256) userphone(VARCHAR 256) content(unsigned INT) year(unsigned INT) month(unsigned INT) hour(unsigned INT) min(unsigned INT) systime(TIMESTAMP)

テーブル5 - content_table
id(unsigned INT key auto_increment) content_name(VARCHAR 256) message(MEDEUMTEXT) rank(unsigned INT)

*データベース上にデータベースとテーブルを作成し、テストを行う。


まぁ長くなりましたが参考程度にどうぞ。お困りだとは思いますけども、もう少し頑張ってみてから質問をするべきだと思います。

データベースに関する知識はお持ちですか?
ファイルにデータを書き込んで…というのでも出来るには出来ます。が、相当大変ですし、バグも多くなる事だと思います。
知識をお持ちで無いのであれば、まずはデータベースに関する知識を得る所から始めると良いかと思います。
「PHP データベース」などで検索してみて下さい。

全体の流れとして、私であればこういった流れを作ります。あくまで参考として。

*予約が可能である、という状態を定義する。それをデフォルトとして、例外の場合も定義する。
例:...続きを読む

QPHPでMySQLを利用した予約カレンダー

PHPでMySQLを利用した予約カレンダーを作成しなければならない課題なのですが、初心者同然の知識ではなかなか難しく、また、思うようなサンプルも見つからず、困っています…。

希望としては、カレンダー表示(うるう年計算や祝日情報を含む)で、データベースに予定が入っていなければ日付にリンク付けをし、枠内に○印を記載、そりてリンクからは予約項目入力ページに移動させるようにしたいと思っています。また、データベースに予定が入っていれば日付のリンク付けはなしで枠内に×印を表示して予約が出来ないようにしたいと考えています。

下記が予約状況を入れたMySQLテーブルです。
mysql> desc reserve;
+--------------+-----------+----+---+-----------------+---------------------------+
|Field |Type |Null|Key|Default |Extra |
+--------------+-----------+----+---+-----------------+---------------------------+
|会員ID |varchar(10)|NO |MUL|NULL | |
|部屋NO |int(3) |NO |MUL|NULL | |
|人数:大人 |int(3) |NO | |NULL | |
|人数:子ども |int(3) |NO | |NULL | |
|チェックイン |date |NO | |NULL | |
|チェックアウト|date |NO | |NULL | |
|宿泊プランNO |int(10) |NO |MUL|NULL | |
|予約登録日 |timestamp |NO | |CURRENT_TIMESTAMP|on update CURRENT_TIMESTAMP|
+--------------+-----------+----+---+-----------------+---------------------------+

出来ればサンプルコード、もしくは希望のサンプルが乗ったURLなどをお教え頂きたく思います。

また、予約画面ではチェックアウト日選択(チェックイン日から1週間以内)や、人数を入力していただくテキストフィールドと宿泊プランの選択プルダウンをつけるつもりでいます。

すみませんがどなたかこの初心者に救いのお手をお貸しくださいませ。
よろしくお願いいたします。

PHPでMySQLを利用した予約カレンダーを作成しなければならない課題なのですが、初心者同然の知識ではなかなか難しく、また、思うようなサンプルも見つからず、困っています…。

希望としては、カレンダー表示(うるう年計算や祝日情報を含む)で、データベースに予定が入っていなければ日付にリンク付けをし、枠内に○印を記載、そりてリンクからは予約項目入力ページに移動させるようにしたいと思っています。また、データベースに予定が入っていれば日付のリンク付けはなしで枠内に×印を表示して予約が出来ないよう...続きを読む

Aベストアンサー

ざっくり書くとこんな感じでカレンダーを表示する
<form>
<p>
<select name="ym">
<option value="201301">2013年 1月</option>
<option value="201302">2013年 2月</option>
<option value="201303">2013年 3月</option>
<option value="201304">2013年 4月</option>
<option value="201305">2013年 5月</option>
<option value="201306">2013年 6月</option>
</select>
<input type="submit" value="go">
</p>
</form>
<?PHP
$ym=isset($_REQUEST["ym"])?$_REQUEST["ym"]:false;
$pattern="/^([0-9]{4})([0-9]{2})$/";
if(preg_match($pattern,$ym,$matches)){
$y=(int) $matches[1];
$m=(int) $matches[2];
$d=mktime(0,0,0,$m,1,$y);
$w=date("w",$d);
$d -=$w*86400;
$table="<table border>\n";
$table.="<caption>{$y}年{$m}月</caption>\n";
$table.="<tr><th>日</th><th>月</th><th>火</th><th>水</th><th>木</th><th>金</th><th>土</th></tr>\n";
while(mktime(0,0,0,$m+1,1,$y) >=$d){
$table.="<tr>";
for($i=0;$i<7;$i++){
$table.="<td>";
if($m != (int) date("m",$d)) $table.="";
else $table.=date("j",$d);
$d+=86400;
$table.="</td>\n";
}
$table.="</tr>\n";
}
print $table;
}

?>

あとは$yと$mをもとに、データベースからひと月分予定を抜いてきて、表示を調整する。
たとえば、こんな感じ・・・
$sql="SELECT 日付,予定 FROM 予定表 WHERE 日付 BETWEEN @d:='{$y}-{$m}-1' AND @d + interval 1 month - interval 1 day";

ざっくり書くとこんな感じでカレンダーを表示する
<form>
<p>
<select name="ym">
<option value="201301">2013年 1月</option>
<option value="201302">2013年 2月</option>
<option value="201303">2013年 3月</option>
<option value="201304">2013年 4月</option>
<option value="201305">2013年 5月</option>
<option value="201306">2013年 6月</option>
</select>
<input type="submit" value="go">
</p>
</form>
<?PHP
$ym=isset($_REQUEST["ym"])?$_REQUEST["ym"]:false;
$pattern="/^([0-9]{4})([0-9]{2...続きを読む

QDBエラーの意味

フォームからDBにデータ挿入しようとすると

Column count doesn't match value count at row 1

というエラーが出てしまいます・・・どういう意味を持ったエラーなんでしょうか?

Aベストアンサー

カラム数と値の数が合わない、と言う事です。簡単な英語なので覚えましょう。
カラム数が4つにもかかわらず、
"INSERT INTO tablename VALUES (1,'hoge',3)"
とやった場合等に出るエラーだと思います。

QPHP ボタンが押されたら処理を実行する

PHPプログラミングをしています。
「はい」というボタンが押されたらこの処理を行い、
「いいえ」というボタンが押されたらこの処理を行う
ということはどうすれば実装できるのでしょうか?

Aベストアンサー

どういう環境下で作っておられるのかが全然わかりませんが、
PHPというこですので、Webベースのフォームですよね。

たとえば、「はい」ボタンと「いいえ」ボタンをそれぞれフォームのSubmitにしておいて、
POST先のフォームで処理を分ければどうでしょうか。

送信元
<form name="Hai" method="POST" action="hoge.php">
<input type="hidden" name="answer" value="1">
<input type="submit" value="はい">
</form>

<form name="Hai" method="POST" action="hoge.php">
<input type="hidden" name="answer" value="0">
<input type="submit" value="いいえ">
</form>


送信先
$answer = $_POST["answer"];

if($answer == 1){
// 「はい」の時の処理
}else{
// 「いいえ」の時の処理
}


ちなみに、自分から自分へPOSTすればPHPスクリプトも2つに分けずにできると思います。
また、POSTじゃなくGETでも同様のことはできると思います。

どういう環境下で作っておられるのかが全然わかりませんが、
PHPというこですので、Webベースのフォームですよね。

たとえば、「はい」ボタンと「いいえ」ボタンをそれぞれフォームのSubmitにしておいて、
POST先のフォームで処理を分ければどうでしょうか。

送信元
<form name="Hai" method="POST" action="hoge.php">
<input type="hidden" name="answer" value="1">
<input type="submit" value="はい">
</form>

<form name="Hai" method="POST" action="hoge.php">
<input type="hidden" name="answer" ...続きを読む

QJSPで作成された「会議室予約システム」の公開サイト

JSPで会議室予約システムを作りたいのですが、元ネタが欲しいのです。どこかにソースコードを公開している方がいらっしゃる方は無いでしょうか?
どうぞよろしくお願いいたします。

Aベストアンサー

> JSPで会議室予約システムを作りたいのですが、元ネタが欲しいのです。
> どこかにソースコードを公開している方がいらっしゃる方は無いでしょうか?

参考URLに挙げたグループウェアは、JSPではなくServletを使ったものですが、ソースが公開されているフリーのものです。
参考にされてはいかがでしょうか?

参考URL:http://www.gs.sjts.co.jp/

QプルダウンメニューでValue値をPHPへの受け渡しができません

こんばんは。

HTML(apache)+MySQL+PHPの連携で、プルダウンメニュ
ー2つとテキストボックス2つの入力内容をPHPにデー
タとして渡し、それをキーワードにして、データベー
スの検索をする、という処理をさせようと思い、PHP
にデータを渡すためのタグを書いています。

http://ns1.php.gr.jp/pipermail/php-users/2002-December/012011.html

を参考に、テキストボックス2つの内容をPHPに渡すこ
とはできたのですが($_POST関数で渡しています)、
プルダウンメニューで選択した場合のvalue値を、PHP
に渡す処理ができず、行き詰っています。

http://www.big.or.jp/~mio/ga/ht/htref/ht_ref_optio.htm

で、プルダウンメニューで選択した場合のvalue値を
渡すことは可能と思い、タグを書きましたが、PHPで
データをダンプさせると何も表示されませんでした。
つまりはPHPにはデータが渡されていない状態で、HTM
Lタグレベルでの問題という事が分かり、タグの勉強
もしましたが、option部分の記述は間違っていないの
では?、と思っています。

ではform actionの、データを送信する送信ボタンの
記述で足りないところがあるのでは、と思い、調べた
のですが解決方法が見つかりません。
どなたかご教授いただけましたら幸いです‥
宜しくお願い申し上げます。

クライアント環境はWin2000、IE6.0
サーバーはRedHat9.0でPHPは4.2.2です。

こんばんは。

HTML(apache)+MySQL+PHPの連携で、プルダウンメニュ
ー2つとテキストボックス2つの入力内容をPHPにデー
タとして渡し、それをキーワードにして、データベー
スの検索をする、という処理をさせようと思い、PHP
にデータを渡すためのタグを書いています。

http://ns1.php.gr.jp/pipermail/php-users/2002-December/012011.html

を参考に、テキストボックス2つの内容をPHPに渡すこ
とはできたのですが($_POST関数で渡しています)、
プルダウンメニューで選択した場合のvalue値を、PHP
...続きを読む

Aベストアンサー

この場合、
<form> タグの位置を変えるだけで動作します。
<select>タグの前に移動させてください。
PHP4.0.6で動作確認済みです。
JavaScript使うまでもなかったですね。失礼しました。
=== 以下ソース ===

<html>
<body>
<form action="yamaha0.php" method="post"> <!-- ここに移動 -->

<br>分類<br>
<select name="clasfct" size="3">
<option value="1">新機能</option>
<option value="2">仕様変更</option>
<option value="3">バグ修正</option>
</select>

<p>

Rev<br>
<select name="rev" size="3">
<option value="1">ver 8.01.15</option>
<option value="2">ver 7.01.34</option>
<option value="3">ver 7.00.29</option>
</select>
<br>

キーワード1を入力してください(必須):<input type="text" name="key1"><br>
<p>
キーワード2を入力してください(任意):<input type="text" name="key2"><br>
<p><input type="submit" name="exec" value="検索">
</form>
</body>
</html>

この場合、
<form> タグの位置を変えるだけで動作します。
<select>タグの前に移動させてください。
PHP4.0.6で動作確認済みです。
JavaScript使うまでもなかったですね。失礼しました。
=== 以下ソース ===

<html>
<body>
<form action="yamaha0.php" method="post"> <!-- ここに移動 -->

<br>分類<br>
<select name="clasfct" size="3">
<option value="1">新機能</option>
<option value="2">仕様変更</option>
<option value="3">バグ修正</option>
</select>

<p>

Rev<br>
<...続きを読む

Qcount(*)で取得した値をJAVAの変数に代入するには?

SQLの話なんですが、
count(*)で取得した値をJAVAの変数に代入するには?

Aベストアンサー

補足
カラム名をつけて取得したいということでしたら、
SELECT 論理カラム名 COUNT(*) FROM テーブル名 WHERE 条件…

論理カラム名

COUNT(*)
の前に半角スペースを入れて記述すれば
論理カラム名
で取得できます。

SELECT 論理カラム名 COUNT(*),カラム1,カラム2 FROM テーブル名 WHERE 条件…
とすれば、
論理カラム名
カラム1
カラム2
が取得できます。

QHTMLフォームのSELECTの幅を一定にするためには?

HTMLフォームのSELECTの幅を一定にするためにはどのようにすれば
いいのでしょうか?

CSS等で設定できるとありがたいのですが、やり方がわかりません。

Aベストアンサー

<select style="width: 200px">

QPHPのif文でその処理を途中で抜けるにはどうすればよいでしょうか?

PHPのif文でその処理を途中で抜けるにはどうすればよいでしょうか?
for文やwhile文ではbreakやcontinueなどが使えるようですが、if文にはないのでしょうか?

条件分岐がいくつかあって、その一つを途中で抜けて次の条件分岐へと移行したいのですが、
exitを使ってしまうと、次へ行かずに処理が中止されてしまいますし、
どのようにすればよいのか分からず困っています。何かよい方法はないでしょうか?

Aベストアンサー

例えば「goto 演算子」を使うとかですね。
http://php.net/manual/ja/control-structures.goto.php
(参考URL)

「if文を強制終了」というより「ステップの強制移動」と言った感じです。

ただ、あまりgoto演算子はお勧めできません。
複雑な処理になればなるほど、バグが発生した際にバグ元を発見し難くなります。

本来は細かく制御文を入れていけば、あまり必要ないと思いますが・・・


人気Q&Aランキング