php - MySQL查找给定长度的所有没有相关记录的周期

标签 php mysql sql

我正在用 PHP/MySQL 制作一个预订系统。

我希望能够选择月份、选择预订时长,并查找该月内有多少给定时长的时段可用(即未标记为预订)。

我首先创建了一个天数表,每一天都有一个字段指示它是否被保留,以及一个日期。这两个表是:

CREATE TABLE `day` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `date` date NOT NULL,
  `booking` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) 

CREATE TABLE `booking` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `start` date DEFAULT NULL,
  `end` date DEFAULT NULL,
  PRIMARY KEY (`id`)
) 

到目前为止,我已经能够计算出一个月中有多少天被预订 - 但这并不一定能告诉我是否连续 7 天:

SELECT  
    EXTRACT(YEAR FROM date) as year,
    EXTRACT( MONTH FROM date) as month,
    count(day.id)
FROM
    day
WHERE booking IS NULL
GROUP BY year, month

此时,我正在考虑加载给定月份的所有日期,并在 PHP 中迭代它们以组成我的数字,但这似乎有点愚蠢且效率低下。有人建议我如何直接从 MySQL 找到这些信息吗?

最佳答案

假设您希望 2012 年 7 月的时间范围至少为 7 天,那么:

SELECT
  DATE_FORMAT(start, '%Y-%m-%d') start,
  MAX(days) AS days,
  DATE_FORMAT(start + INTERVAL MAX(days) - 1 DAY, '%Y-%m-%d') end
FROM (  
  SELECT
    d2.`date` start,
    (@days := IF(IFNULL(d2.booking, 0) = 0, @days + 1, 1)) AS days
  FROM
    (SELECT @days := 1) a,
    day d1
  LEFT JOIN  
    day d2 on d2.`date` = d1.`date` + INTERVAL 1 DAY
  WHERE
    IFNULL(d1.booking, 0) = 0
) d1
GROUP BY
  start
HAVING
  (
    EXTRACT(YEAR_MONTH FROM start) = 201207 OR
    EXTRACT(YEAR_MONTH FROM (start + INTERVAL MAX(days) - 1 DAY)) = 201207
  ) AND
  days >= 7
ORDER BY
  start

将产生以下输出:

|      START | DAYS |        END |
----------------------------------
| 2012-06-25 |   13 | 2012-07-07 |
| 2012-06-26 |   12 | 2012-07-07 |
| 2012-06-27 |   11 | 2012-07-07 |
| 2012-06-28 |   10 | 2012-07-07 |
| 2012-06-29 |    9 | 2012-07-07 |
| 2012-06-30 |    8 | 2012-07-07 |
| 2012-07-01 |    7 | 2012-07-07 |
| 2012-07-23 |    8 | 2012-07-30 |
| 2012-07-24 |    7 | 2012-07-30 |

条款

(  
    EXTRACT(YEAR_MONTH FROM start) = 201207 OR
    EXTRACT(YEAR_MONTH FROM (start + INTERVAL MAX(days) - 1 DAY)) = 201207
) 

用于包含所有范围,即使范围延伸到上个月或下个月。如果您想要仅在一个月内出现的范围,请使用:

EXTRACT(YEAR_MONTH FROM start) = 201207 AND
EXTRACT(YEAR_MONTH FROM (start + INTERVAL MAX(days) - 1 DAY)) = 201207

参见http://sqlfiddle.com/#!2/4e36a/4进行交互式演示。

关于php - MySQL查找给定长度的所有没有相关记录的周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12662667/

相关文章:

php - 无法在zend数据库中插入记录?

php - 如何在php中从数据库中获取图像

MySQL:使用连接表将行拆分为多行?

java + reSTLet = 奇怪的性能行为

mysql - 如何根据用户在特定时期内的声誉来选择用户?

php - sql - 获取所有用户好友

mysql - 在 SQL 的一对多关系中查找重复项

php - 加盐密码?

php - 为什么 json_encode/decode 以这种方式配置我的数组? PHP

sql - 将多行插入 DB2 数据库