我有一個事件/日曆MySQL表,其中每個用戶在一天中有多個約會/事件。如果一個用戶因爲他/她在其他約會中跑步而無法進行該預約/事件「我需要能夠將該約會重新分配給不同的可用用戶。因此,我需要顯示在預定時間範圍內可用的前5位用戶的建議,並且可以進行此預約,經理將能夠將該預約重新分配給建議用戶之一。如何從日曆數據庫獲取可用時間段的列表
我的活動表看起來像這樣
CREATE TABLE `calendar_events` (
`event_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`start_on` datetime NOT NULL,
`end_on` datetime NOT NULL,
`subject` varchar(255) NOT NULL,
`event_type` enum('Phone Call','Meeting','Event','Appointment','Other') CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL DEFAULT 'Phone Call',
`all_day_event` tinyint(1) DEFAULT '0' COMMENT '1 = all day event, 0 = no',
`phone_call_id` int(11) unsigned DEFAULT NULL,
`account_id` int(11) unsigned DEFAULT NULL,
`client_id` int(11) unsigned DEFAULT NULL,
`owner_id` int(11) unsigned NOT NULL,
`created_by` int(11) unsigned NOT NULL,
`created_on` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`modified_by` int(11) unsigned DEFAULT NULL,
`modified_on` datetime DEFAULT NULL,
`event_location` varchar(255) DEFAULT NULL,
`event_notes` varchar(10000) DEFAULT NULL,
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '0 = purged, 1 = active, 2=pass, 3 = cancled, 5 = waiting for auditor to be enabled',
PRIMARY KEY (`event_id`),
UNIQUE KEY `phone_call_id` (`phone_call_id`,`account_id`,`client_id`),
KEY `client_id` (`client_id`),
KEY `account_id` (`account_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
所以讓我們的事項標識= 100被分配到user_id說明= 2,定於START_ON = '2014年9月21日10:00:00' 和end_on「 2014-09-21 10:00:00'
and user_id = 5 has appointment start_on'2014-09-21 11:45:00'and end_on'2014-09-21 12:30:00'
和user_id = 2無法預約'2014-09-21 10:00:00',因此他們的系統會建議user_id = 5,因爲他將會接下來的105分鐘。
的最終數據集將需要
event_id org_owner suggested_owner available_for
100 2 5 105
下面的查詢會給我所有可用的用戶列表從users
表與START_ON end_on值一起,如果用戶有一個事件安排(一個用戶可以有多個記錄。)如果此查詢中的start_on爲空,則表示此用戶沒有任何事件,否則將返回每個事件的開始。
因此,如果用戶ID出現在上面的查詢中,並且在start_on列中有一個NULL值,這意味着該用戶可以整天使用,因此該用戶應該是推薦的5個用戶中的1個,因爲它具有最高可用性。但是,如果用戶在數據集中有一個/多個行,並且開始時的值爲非空值,那麼我們需要查看離事件最近的start_on,然後推薦具有最高可用性的前5個值。
SELECT user_id, start_on, end_on, subject
FROM view_users AS su
LEFT JOIN calendar_events AS c ON c.owner_id = su.user_id AND c.start_on NOT BETWEEN '2014-09-30 00:00:00' AND '2014-09-30 23:59:59' AND c.status = 1
WHERE su.is_available_today = 1
如何提取此數據集?
它無法正常工作。另外,event_type不應該是因素。無論事件類型如何,每個人都可以參加下一次預約。不工作意味着建議的所有者與org_owner的名稱相同。 org_owner必須不同於作爲建議所有者的suggested_owner是新的可用用戶。 – Jaylen 2014-09-30 22:21:31
我創建了表格並填充了數據,它似乎在爲我工作。你能提供一小部分數據嗎?謝謝編輯:剛剛看到關於名稱的解釋,它會通過添加'cal_avail.owner_id <> calendar_events.user_id'最後'on'子句工作嗎? – nicolas 2014-09-30 22:23:39
這並沒有奏效。這裏是我用一些數據創建的小提琴給你一些數據http://sqlfiddle.com/#!9/8374f/1通知,查詢我縮小查詢event_id = 52,所以我可以找到3個建議用戶 – Jaylen 2014-09-30 22:39:15