【问题标题】:Between a MIN and MAX date in joined table连接表中的 MIN 和 MAX 日期之间
【发布时间】:2015-08-04 04:03:22
【问题描述】:

我有一个名为 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

所以我需要从这里加入设施预订并在最低日期和最高日期之间进行搜索。

希望有人可以帮助我:)

【问题讨论】:

  • sqlfiddles 很好,但知道样本数据的预期结果更好。

标签: mysql sql join


【解决方案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

【讨论】:

    【解决方案2】:

    如果您只想包含所有 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-12
      • 1970-01-01
      • 2014-08-08
      • 2017-06-10
      • 2015-01-23
      • 2016-11-17
      • 2019-03-01
      • 2012-06-26
      相关资源
      最近更新 更多