MySQLの予約システムで作業していますが、次に利用可能な予約枠を見つけるためのクエリで少し問題が発生しています。
私の日は15分のスロットに分けられます(00:00:00〜00:14:59、00:15:00〜00:29:59など)。これまでのテーブル構造:
予定表:
CREATE TABLE IF NOT EXISTS `appointments` (
`appointmentID` int(9) unsigned NOT NULL AUTO_INCREMENT,
`patientID` int(9) unsigned NOT NULL,
`apptTitle` varchar(50) NOT NULL,
`apptDT` datetime NOT NULL,
`apptLength` int(4) NOT NULL,
`apptStatus` varchar(25) NOT NULL,
`physician` int(9) unsigned NOT NULL,
`apptType` varchar(30) NOT NULL,
`apptLocation` varchar(25) NOT NULL,
PRIMARY KEY (`appointmentID`),
KEY `patientID` (`patientID`),
KEY `physician` (`physician`),
KEY `apptStatus` (`apptStatus`),
KEY `apptLocation` (`apptLocation`),
KEY `apptType` (`apptType`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
apptSlotsテーブル:
CREATE TABLE IF NOT EXISTS `apptSlots` (
`startDT` datetime NOT NULL,
`endDT` datetime NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
上で説明したように、apptSlotsテーブルは2012年の15分のスロットすべてですでに埋められています。
まったく使用されていない(予定がまったくスケジュールされていない)スロットを正常に表示できるクエリがあります。
SELECT a.*
FROM apptSlots AS a
LEFT JOIN appointments AS b
ON a.endDT
BETWEEN b.apptDT AND DATE_ADD(b.apptDT, INTERVAL b.apptLength MINUTE)
AND b.appointmentID IS NULL
ここで行う必要があるのは、複数の医師、複数の部屋などで予約枠を検索することです。たとえば、医師Aが午前7時から午前8時までの予約をした場合、その時間枠は上記のクエリに表示されなくなります。しかし、医師BとCにはそのスロットの予定がないので、それらをスケジュールできるようにする必要があります。同じことが部屋にも当てはまります。部屋Aは午前7時の予定で使用されますが、部屋BとCは引き続き自由にスケジュールできます。
これらすべての変数で空きスロットを決定するにはどうすればよいですか?私は、各組み合わせのWHERE条件でテストできることを知っています。これは、特定の医師または治療のための特定の部屋をテストする必要がある場合に機能します。しかし、すべての医師と部屋のすべてのスロットを表示したいだけの場合、クエリは機能せず、すべての可能な組み合わせを個別にテストすることは正しくないようです。LEFTJOIN句に適切な条件を設定する方法の問題です。 。
不明な点がありましたらお知らせください。十分な情報だと思います。そうでない場合は、あなたが求めるものは何でも追加します!
あなたの助けに感謝します、ここでの私の前の質問は上記の私の質問まで私を手に入れました、今私はいくつかの改良が必要です。あなたが必要とするどんな質問でもしてください、私は彼らに答えるためにここにいます!