• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:自身の結果に自身で検索?)

自身の結果に自身で検索?

このQ&Aのポイント
  • php+mysqlで予約システムを作成中ですが、mysqlのクエリ作成に行き詰まっています。
  • 予約テーブルにはid、roomID、startTime、endTimeのカラムがあります。
  • 重複した予約を表示するために、予約テーブルのstartTimeを他の予約開始日時と比較する方法がわかりません。

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

だいたいやりたいことが分かってきました。 こんなんでどうでしょう? select t3.id,t3.roomID,t3.startTime,t3.endTime,coalesce(count,0) as count from tbl as t3 left join( select t1.id,count(*) as count from tbl as t1 inner join tbl as t2 on t1.roomID=t2.roomID where ( t1.startTime >= t2.startTime and t1.startTime < t2.endTime or t1.endTime > t2.startTime and t1.endTime <= t2.endTime or t2.startTime >= t1.startTime and t2.startTime < t1.endTime or t2.endTime > t1.startTime and t2.endTime <= t1.endTime ) and not t1.id=t2.id group by t1.id ) as sub on t3.id=sub.id

retro_s
質問者

お礼

完璧でした! ようやくゴールする事ができました。 理解するのに時間がかかってしまいましたが、 実現することができました。 色々と勉強になることがあり、感謝感謝です。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

ちょっとやってみました・・・ 前の終了時刻と後の開始時刻が一緒でもいいという条件を加えてちょっとやってみました。 create table tbl (id int not null primary key auto_increment ,roomID int, startTime datetime,endTime datetime); insert tbl values (1,1,'2011-10-25 10:00:00','2011-10-25 11:00:00') ,(2,1,'2011-10-25 11:00:00','2011-10-25 12:00:00') ,(3,2,'2011-10-25 10:00:00','2011-10-25 11:00:00') ,(4,2,'2011-10-25 10:30:00','2011-10-25 11:30:00') ,(5,2,'2011-10-25 12:00:00','2011-10-25 13:00:00') ,(6,2,'2011-10-25 13:00:00','2011-10-25 14:00:00') ,(7,2,'2011-10-25 13:50:00','2011-10-25 16:00:00') ,(8,2,'2011-10-25 9:00:00','2011-10-25 18:00:00') ; まず、roomID=1の部屋についてはid=1の終了時刻とid=2の開始時刻が一緒なので エラーにはなりません。 roomID=2の部屋について、 3と4、6と7がかぶっており、さらにそれらをまとめて8がかぶっているとします。 これを処理するにはこんな感じになります。 select t1.roomID,t1.id as id1,t2.id as id2 from tbl as t1 inner join tbl as t2 on t1.roomID=t2.roomID where ( t1.startTime >= t2.startTime and t1.startTime < t2.endTime or t1.endTime > t2.startTime and t1.endTime <= t2.endTime or t2.startTime >= t1.startTime and t2.startTime < t1.endTime or t2.endTime > t1.startTime and t2.endTime <= t1.endTime ) and t1.id<t2.id もう少し条件はしぼれるかもしれません。

retro_s
質問者

お礼

度々ありがとうございます。 自己結合についてなんとなく理解しました。 前回と今回のご回答をヒントに色々試してみています。 ただ、実現したいことにどんどん近づいているのですが、なかなかゴールになりません。 お恥ずかしいのですが、下記結果を求めるには、ここからどう導き出したら良いのでしょうか。 _______________________________________________________________________ | id | roomID | startTime | endTime | count(重複数) | -------------------------------------------- tblの全レコード + それぞれのレコードに対しての重複数という感じです。 予約を一覧表示したい為、重複していない予約(今回ならば1と2)のレコードも欲しいのです。 一覧画面を要約して書きますと、 _____________________________________________ | 予約No | 重複予約 | 予約確認 | ---------------------------- |   1   |    なし   |   確認   | ---------------------------- |   2   |    あり   |     確認   | ---------------------------- 将来的には、ここで”確認”を押すことで、予約Noに対応した重複予約を 別画面で表示するようにします。 重複なしの場合は、そのまま予約を確定するという流れです。 度々申し訳ありませんが、お手隙で構いませんので、宜しくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

>実現したいのは、予約日時が被っている部屋id、予約テーブルのidの抽出(重複した予約)です。 >一覧画面にて、予約に対して重複があるかないかを表示したいです。 えーと、少し仕様がわかりづらいです (1)これは同じ部屋に予約時間が重複してはいけないという意味ですよね? 別の部屋であれば同じ時間帯に予約が入ってよいと思っていいですね? たとえば、部屋Aと部屋Bがあって 部屋Aの10:00~11:00と部屋Aの10:30~12:00は問題だけど 部屋Aの10:00~11:00と部屋Bの10:30~12:00があっても問題ない ということですよね? (2)時間の重複は、同一時刻は含むのでしょうか 部屋Aの10:00~11:00と部屋Aの11:00~12:00は同じ11:00を含みますが 入れ替わりですから問題ないのでしょうか? それともはち合わせる可能性があるので問題あるのでしょうか? それをおいておいくとすれば自己結合すればいっぱつですね select id,roomID from テーブル as t1 inner join テーブル t2 on t1.roomID=t2.roomID and not t1.id=t2.id where t1.starTime between t2.startTime and t2.endTime or t1.endTime between t2.startTime and t2.endTime こんな感じ。

retro_s
質問者

お礼

さっそくのご回答ありがとうございます。 仕様について(2)は入れ替わりなので問題ないです。 他はご推察の通りです。 わかりづらくて申し訳ありませんでした。 「自己結合」というのでしたか。 今回いただいたクエリ文を試しながら、自己結合勉強します。 とても助かりました。本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • mysqlで検索結果にupdateをしたい

    mysqlで検索した結果に対して 同一テーブルの他のカラムに共通の文字列を書き込みたいです。 たとえば、 SQLで検索した結果に対して、対象レコードの「price」の項目に 「300」の文字列を登録するイメージです。 例: 元のレコード name    price りんご みかん なし 「ん」で対象レコードを検索した結果イメージ: name    price りんご みかん このとき、「ん」に該当する「price」のカラムに 「300」と値段を登録したいです。 理想の処理結果のイメージ: name     price りんご 300 みかん 300 お手数ですが、アドバイスよろしくお願いします。

  • PHPでの検索について

    PHPでMySQLを使ってテーブルから検索しようとしています。 テーブルの構造は id zaiko zaikoid の3つのカラムで構成されています。 このテーブルから 1.zaikoidでソート 2.zaikoでソート 3.zaikoから検索 を一度に行いたいのですが、どのようなSQL文を実行すれば良いのでしょうか… order by と auther を使えばどうにかなりそうなのですが中々正しく実行できません。 ご教授の程宜しくお願い致します。

  • 検索結果表示について

    こんにちは。お世話になっております。 あるテーブルからの検索結果をPHPにてブラウザ上に表示させる際のコードに関しての質問なのですが、これまで、検索したいレコードが1つである事を条件にした場合、以下のコードのどちらが適切なのでしょうか? if($rows==1){ while($row = mysql_fetch_array($result))   ・   ・ echo $row["id"]; または、 if($rows ==1){ $id = mysql_result($result, 0, "id"); echo $id; どちらもブラウザでは同じ結果が返ってくるかと思われますが、諸先輩方々からのアドバイスを頂ければと、投函させて頂きました。 お忙しい中恐縮ですが宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • INDEXと検索

    INDEXが着いていないカラムをSELECTで検索しても他のカラムにプライマリーキーがあれば、検索は高速になるのでしょか? テーブル ID、NAME IDにプライマリーキーが付いていて、NAMEのカラムのみを検索するときにも高速になるのでしょうか?

    • ベストアンサー
    • MySQL
  • グループ化のSQL文について

    このジャンルでお願いします。 tbl id  starttime endtime val 1     0      40  3 2     160    170  1 3     160    190  2 starttimeとendtimeは「分(160なら60×2+40で2時40分になります)」で保存してます。 このようなテーブルで、時間毎にvalの平均を出したいのですが、 id  hour avg(val) 1    0   3  ← 0~1時まで 2    1   0  ← 1~2時まで 3    2   1.5  ← 2~3時まで 4    3   2  ← 3~4時まで ・ ・ 24   23   0  ← 23~24時まで といった感じで24区間に分けてその区間毎のvalの平均を出したいです。 これはどのようなSQL文になるのでしょうか? またこのようなSQL文で1度に取得するやり方と、 いったん全行取得してPHPなどでループして平均を計算するやり方とでは レコード数が増えてきた場合にどちらが速いとかはあるのでしょうか?

    • ベストアンサー
    • MySQL
  • 予約システムでの時間の設計について

    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を 考える場合、非常にやっかいなような気がしてきました。 何か別のよい設計のヒントがあればご教授願えないでしょうか。 宜しくお願いいたします。

  • ひらがなの検索結果が正常ではない

    初めての投稿です よろしくお願いします MySQLにてひらがなが入っているカラムでorder byしても予想に反します。文字コードが原因だとは思うのですが、MySQLの設定方法がよく分かっていません。ご指導、よろしくお願いします。 --- MySQLサーバーはLinux Windowsからターミナルにてテーブル作成、データ入力およびselectを実行 mysql> show columns from HOGE; +-----------+-------------+------+-----+ | Field | Type | Null | Key | +-----------+-------------+------+-----+ | id_c | int(11) | | PRI | | hoge_name | varchar(20) | YES | | +-----------+-------------+------+-----+ 2 rows in set (0.00 sec) mysql> select * from HOGE; +------+------------------+ | id_c | hoge_name | +------+------------------+ | 1 | あいうえお | | 2 | かきくけこ | | 7 | まみむめも | +------+------------------+ 11 rows in set (0.00 sec) mysql> select * from HOGE order by hoge_name; +------+------------------+ | id_c | hoge_name | +------+------------------+ | 7 | まみむめも | | 1 | あいうえお | | 2 | かきくけこ | +------+------------------+ 11 rows in set (0.00 sec)

    • ベストアンサー
    • MySQL
  • 複数の検索

    PHPとMYSQLをつかっています 会員情報から友達の名前を登録できるようにしました postで受け取った情報は友達の名前のみです 友達の名前から友達のID番号を取得したいのですが、15人分まとめて取得する方法はありますか? 調べるテーブルのカラムにはidとnameがあります(idとnameに重複はありません) htmlフォームは(input=text)が15個ほどあって、何も記入されていない欄もあります(fre3に書き込んであってfre2が空白の場合があります) $fre1 = $_POST['fre1']; $fre2 = $_POST['fre2']; $fre3 = $_POST['fre3'];    ・    ・    ・ $sql = sprintf("SELECT id FROM friend WHERE name LIKE '%s'",$fre1); $recordSet = mysql_query($sql); $data = mysql_fetch_assoc($recordSet);

    • ベストアンサー
    • MySQL
  • 同じデータが結果として出てくるので困ってます

    他人が作ったものを修正中です。 現在↓ カラム ID NO1 NO2 NO3     1  12 23 34 2 12 3 12 23 $sql="SELECT ID FROM `SHOPLIST`"; $db = mysql_query($sql); while($db2 = mysql_fetch_array($db)){ ・・・・省略 } 結果抽出データは 1 1 1 2 3 3 なぜか6件です。 NO1,NO2,NO3に値が入っている数と重複するデータ数が同じです。 現在はif文を使ってIDが同じものは処理しないという動きです。 これをif文を使わずに、MySQLだけでIDが同じものは抽出しないと いうことはできるのでしょうか。 考え方だけでも教えて頂きたいです、宜しくお願い致します。   

  • Access クエリ検索結果

    Accessを利用して顧客管理をしています。顧客基本情報tableの顧客IDと予約表tableの顧客IDを繋げて予約日と予約者名をクエリで出しています。 ところが、検索時になぜか入力した日とは別の日に入れ替わって予約者名が出てきてしまうことがよくあります。例えばAさんを10月26日で入力したのに(別紙に記録が残っています)、10月30日の予約者としてでてきてしまうのです。なので26日の時点でAさんが予約者とは知らずに受け付けで混乱してしまいます。 予約表クエリを開くたびに、同じ日付で違う答えが返ってきてしまうこともあります。(人数が増えていったりとか) どうしたら良いでしょうか?教えてください。