3

予定を追跡するための PHP/MySQL アプリケーションを作成していますが、条件がいくつ選択されているかどうかに基づいて、次に利用可能な予定を見つけようとしています。

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,
`apptDate` date NOT NULL,
`apptTime` time NOT NULL,
`apptLength` int(4) NOT NULL,
`apptStatus` varchar(25) NOT NULL,
`physician` int(9) unsigned NOT NULL,
`apptType` varchar(30) NOT NULL,
`apptInvoice` varchar(10) NOT NULL,
`apptNotes` varchar(1000) NOT NULL,
`apptLocation` varchar(25) NOT NULL,
`apptReminder` int(4) 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 ;

補足: Type、Location、Status フィールドは varchar であり、ルックアップ テーブルにリンクされています。したがって、各項目の ID ではなく、実際の値を格納しています (したがって、各ルックアップ テーブルは PK としてのフィールド値であり、ID 列はありません)。将来の結合を減らすためにこれを行いましたが、これがわずかに非正規化されていることはわかっています。これが間違った方法である場合は、お気軽にお知らせください。少し非正規化すれば、後でそれらの結合を行う必要がないことを知っている以外に、圧倒的な証拠を何らかの方法で見つけていませんでした。「更新時」ロジックが配置されているため、変更が行われると、予定テーブルの値が更新されます。

ここでの目標は、利用可能なすべての予約枠を表示することです (これらは 15 分の枠なので、午前 12:00 ~ 午前 12:14:59、午前 12:15:00 ~ 午前 12:29:59 など)。デフォルトでは、次の X 日間 (おそらく 14 日) のすべての予約枠を制限なしで表示するだけです。でも、患者が特定の医者に診てもらいたい場合は、その医者に限定したいですし、医者が診察だけを必要とする場合は、場所を診察室に限定して検査室を占有しないようにすることもできます. または、フォローアップを X か月間スケジュールする必要があることがわかっているので、その時間が経過した後の日数を表示し始めることができます。または、患者は週末または午後 5 時以降にしか予約できません。

私が読んだことから、ある種の予約「スロット」テーブルが必要ですが、既存の予約と比較して自分のスロットを見つけることができるように、そのテーブルをどのように構成するかわかりません。

私は MySQL についてかなりのことを知っており、常に挑戦していますが、これをどのように行うかについて頭を悩ませているようには見えません。同様の質問を探しましたが、探しているカスタマイズの量を実際にカバーしているようには見えず、そのコードを調整して機能させる方法がわかりませんでした。うまくいけば、誰かが私がこのアイデアでどこに行く必要があるかを理解するのを手伝ってくれるでしょう!

よろしくお願いします。

4

1 に答える 1

0

将来の「結合の削減」を計画することは正当な理由ではないと思います。「更新ロジック」を使用して(自分または他の人のために)作成している将来の頭痛の種についてもっと心配する必要があります。あなたが言ったように、タイプ、場所、ステータスなどのフィールドには、スロット クエリに関連するメタデータが含まれている可能性があるため (タイプ「X か月以内にフォローアップが必要」、場所「試験室」)、とにかく最終的には参加する必要があります。 . 時間枠の利用可能な場所を見つけるだけでも、私の理解が正しければ、間違いなく参加する必要があります.

「スロット」は5分のタイムスパンのようなものだと思いますか?例えば。12:00-12:04:59、12:05-12:09:59など?

アレックスが上で言ったように、(一時的かどうかに関係なく) 左結合するには、「すべての可能なスロット」テーブルが必要です。

頻繁に参照されるため、おそらくディスク上に永続的に作成します。無駄に思えますが、もう 1 つのオプションは、毎回動的に生成することです。これもあまり良くありません。

次に、次のような医師の利用可能なスロットを見つけると言います。

SELECT a.* 
FROM slots AS a
LEFT JOIN appointments AS b
ON a.startDate BETWEEN b.apptDate AND DATE_ADD(b.apptDate,INTERVAL b.apptTime MINUTE)
AND b.physician=1234 
WHERE b.appointment IS NULL

他のより複雑なクエリについても、ご要望に沿うものであると思われる場合は、お手伝いさせていただきます。

于 2012-10-08T18:32:45.593 に答える