【发布时间】:2014-11-15 18:05:24
【问题描述】:
我有一个事件/日历 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;
所以让我们将 event_id = 100 分配给 user_id = 2 并安排为 start_on = '2014-09-21 10:00:00' 和 end_on '2014-09-21 10:00:00'
并且 user_id = 5 有约会 start_on '2014-09-21 11:45:00' 和 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 then中的值是非空的,我们需要查看最接近事件的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
如何提取此数据集?
【问题讨论】:
标签: mysql calendar appointment