在连接表中的MIN和MAX日期之间

时间:2015-05-22 08:07:53

标签: mysql sql join

我有一个名为Booking的表和一个名为FacilityBooking的表。预订是设施预订的组合,是一对多的关系。预订的日期和时间由最低开始日期和属于它的设施预订的最高结束日期确定。

我想提供两个日期之间有多少私人和多少商业预订的统计数据。

CREATE TABLE `Booking` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `comments` varchar(255) DEFAULT NULL,
  `createdBy` varchar(255) DEFAULT NULL,
  `customerName` varchar(255) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  `isPaid` bit(1) DEFAULT NULL,
  `isPrivateClient` bit(1) DEFAULT NULL,
  `needsPermission` bit(1) DEFAULT NULL,
  `phoneNumber` varchar(255) DEFAULT NULL,
  `referenceNumber` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



# Dump of table FacilityBooking
# ------------------------------------------------------------

CREATE TABLE `FacilityBooking` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `comments` varchar(2000) DEFAULT NULL,
  `from` datetime DEFAULT NULL,
  `to` datetime DEFAULT NULL,
  `bookablePlace_id` int(11) DEFAULT NULL,
  `booking_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `FK_2tv9w7g5vyx9po8vs6ceogldb` (`bookablePlace_id`),
  KEY `FK_n17h188ecbdos5lsva51b8j29` (`booking_id`),
  CONSTRAINT `FK_n17h188ecbdos5lsva51b8j29` FOREIGN KEY (`booking_id`) REFERENCES `Booking` (`id`),
  CONSTRAINT `FK_2tv9w7g5vyx9po8vs6ceogldb` FOREIGN KEY (`bookablePlace_id`) REFERENCES `BookablePlace` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我创建了一个sqlfiddle:http://sqlfiddle.com/#!9/7ae95/2

这就是我到目前为止所做的:

SELECT
    CASE isPrivateClient
        WHEN 0 THEN "business"
        WHEN 1 THEN "private"
    END AS clientType,
    count(isPrivateClient) as count
FROM
    Booking
GROUP BY
    isPrivateClient

所以我需要的是加入设施预订,并在最短的日期和最高的日期之间进行搜索。

希望有人可以帮助我:)。

2 个答案:

答案 0 :(得分:1)

加入FacilityBooking表并使用WHERE过滤:

SELECT
    CASE isPrivateClient
        WHEN 0 THEN "business"
        WHEN 1 THEN "private"
    END AS clientType,
    count(FacilityBooking.id) as count
FROM
    Booking INNER JOIN FacilityBooking ON
    Booking.id = FacilityBooking.booking_id
-- Between 2015-05-01 AND 2015-06-01 INCLUSSIVE'
WHERE FacilityBooking.from <= '2015-06-01' AND FacilityBooking.to >= '2015-05-01'
GROUP BY
    isPrivateClient

已修复fiddle

答案 1 :(得分:1)

如果您只想包含“完整”预订,其中所有FacilityBooking都在2日期之间,那么这样的事情应该可以解决问题:

SELECT clientType, count(bookId)
FROM (
    SELECT
        b.id as bookId,
        CASE b.isPrivateClient
            WHEN 0 THEN "business"
            WHEN 1 THEN "private"
        END AS clientType,
        Min(fb.from) as minFrom,
        Max(fb.to) as maxTo
    FROM
        Booking b
        INNER JOIN FacilityBooking fb ON b.id = fb.booking_id
    GROUP BY bookId
  ) tbl

WHERE minFrom >= '2015-05-22' -- Min Date
AND maxTo <= '2015-05-24' -- Max Date

GROUP BY
  clientType