这个mysql查询的多对多关联

时间:2014-09-04 20:25:17

标签: mysql sql doctrine-orm doctrine

我有一个表Appointments,它有start_date,end_date,cabinet_id,以及通过连接表与专家的多对多关系。基本上,我需要获得约会之间的所有空闲插槽,其中cabinet_id是精确的,并给出了多个专家ID。对于免费插槽,我编写了查询,通过cabinet_id查找空闲插槽,但不知道如何修改查询以根据多对多查询选择空闲时间。

Basicaly我需要找到所有专家免费的免费插槽,cabinet_id也是免费的。

我目前对免费插槽的查询:

SELECT
  a.cabinet_id, 
  a.end_time AS 'Unused From', 
  Min(b.start_time) AS 'Until'
FROM `Appointment` AS a  
JOIN `Appointment` AS b ON a.cabinet_id=b.cabinet_id AND a.end_time <= b.start_time
WHERE a.cabinet_id = 4
GROUP BY a.end_time
HAVING a.end_time < MIN(b.start_time) 
ORDER BY cabinet_id

表结构:

CREATE TABLE `Appointment` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cabinet_id` int(11) DEFAULT NULL,
  `patient_id` int(11) DEFAULT NULL,
  `start_time` datetime NOT NULL,
  `end_time` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `IDX_78A47793D351EC` (`cabinet_id`),
  KEY `IDX_78A477936B899279` (`patient_id`),
  CONSTRAINT `FK_78A477936B899279` FOREIGN KEY (`patient_id`) REFERENCES `Patient` (`id`),
  CONSTRAINT `FK_78A47793D351EC` FOREIGN KEY (`cabinet_id`) REFERENCES `Cabinet` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=338 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `appointment_specialist` (
  `appointment_id` int(11) NOT NULL,
  `specialist_id` int(11) NOT NULL,
  PRIMARY KEY (`appointment_id`,`specialist_id`),
  KEY `IDX_BB6E783EE5B533F9` (`appointment_id`),
  KEY `IDX_BB6E783E7B100C1A` (`specialist_id`),
  CONSTRAINT `FK_BB6E783E7B100C1A` FOREIGN KEY (`specialist_id`) REFERENCES `Specialist` (`id`) ON DELETE CASCADE,
  CONSTRAINT `FK_BB6E783EE5B533F9` FOREIGN KEY (`appointment_id`) REFERENCES `Appointment` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `Specialist` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `first_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `last_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `profession` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `user_id` int(11) DEFAULT NULL,
  `color` varchar(7) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `UNIQ_8D7A4924A76ED395` (`user_id`),
  CONSTRAINT `FK_8D7A4924A76ED395` FOREIGN KEY (`user_id`) REFERENCES `User` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

0 个答案:

没有答案