2012-10-08 21 views
3

我正在編寫一個用於跟蹤約會的PHP/MySQL應用程序,並且我堅持根據是否選擇任意數量的條件來查找下一個可用預約。具有多個條件的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 ; 

旁註:你會發現我喜歡的類型,位置,狀態字段爲VARCHAR的,和他們連接到查找表。因此,我存儲了實際值,而不是每個項目的ID(因此每個查找表只是PK的字段值,沒有ID列)。我已經做到了這一點,以減少未來的連接,但我知道這是輕微的非正規化。如果這是一個錯誤的路要走,請隨時告訴我,除了知道如果我稍微規範化一些後再不必做這些連接,我還沒有找到壓倒一切的證據。有「更新」邏輯,所以如果進行了更改,它將更新約會表中的值。

這裏的目標是顯示所有可用的預約插槽(這些是15分鐘插槽,所以12:00 am-12:14:59am,12:15:00 am-12:29:59am等)。默認情況下,我只是在沒有限制的情況下顯示接下來X天(可能是14天)的所有預約時段。但是,如果病人想看特定的醫生,我想限制一下,或者如果醫生只需要諮詢,我就可以將診所的位置限制在一個諮詢室而不需要考試室。或者,我們知道後續行程需要安排X個月,所以我可以在這段時間過後的幾天開始展示。或者,病人只能在週末或下午5點後預約。

從我讀過的內容中,我需要某種預約「插槽」表格,但我不確定我如何構建該表格,以便將其與現有約會進行比較並找到我的插槽。

我知道一個關於MySQL的好方面,我總是面臨一個挑戰,但我似乎無法圍繞我如何做到這一點。我查找過類似的問題,但沒有一個真正涉及到我正在尋找的定製數量,我無法弄清楚如何調整該代碼以使其適用於我。希望有人能幫助我理解我需要採用這個想法的地方!

非常感謝您的幫助!

+0

編寫一個存儲過程,它可以實時生成一個臨時槽表,並根據您的邊界條件將現有約會與該表匹配並過濾。顯示後,放下臨時表。 –

回答

0

我不認爲計劃未來「減少聯合」是一個很好的理由。你應該更加擔心你正在創建的「更新邏輯」(針對你或其他人)的未來頭痛。就像你說的那樣,類型,位置和狀態等字段可能具有與您的老虎機查詢相關的元數據(類型「需要X個月後續」,位置「是考場」),所以無論如何您都需要加入。即使只是爲了找到某個時段的可用位置,如果我理解正確,您也一定需要加入。

我猜一個「插槽」就像是一個5分鐘的時間跨度?例如。 12:00-12:04:59,12:05-12:09:59等?

就像Alex上面說過的,你需要一個「所有可能的位置」表來左連接(臨時或不連接)。

我可能會在磁盤上永久創建它,因爲它被引用了很多。這聽起來很浪費,但另一種選擇是每次動態生成它,這也不是很好。

然後說找醫生可用插槽,是這樣的:

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 

我可以盡力幫助你的其他更復雜的查詢,如果這聽起來像它的你以後在正確的軌道上。

+0

是的,這是15分鐘的插槽。我已經更新了原來的問題。 我喜歡你的推理,爲什麼我不應該反規範化。對於其他元數據,我還沒有想到這麼遠,感謝評論。 至於槽表,該表需要多大「多大」?從您的查詢中,它看起來每天都必須是每個插槽。將桌子打破幾年纔有意義,所以它們不是可怕的桌子? 再次感謝您的評論! – bandgeekndb

+0

是的,它應該是可以保留的每個可能的插槽。我會根據需要不斷添加它(例如,每天添加未來3年的任何缺失插槽)。它看起來很大,但它在10年內<3MB(350k日期時間行),你會很驚訝MySQL將如何有效地處理它。當然,只有在使用它時才加入你需要的東西:如果一個人下週要保留某些東西,你的加入會限制這個範圍。 – gllen

+0

PS:您對「減少連接」和將表分成多年的評論告訴我,您不相信MySQL能夠完成它的工作。您應該更加信任它,保持簡單的表格設計,並且確信如果出現性能問題時,您會有很多選擇。 – gllen