【问题标题】:MYSQL Select MAX COUNT in DATE RANGEMYSQL 在 DATE RANGE 中选择 MAX COUNT
【发布时间】:2017-11-24 06:37:45
【问题描述】:

我查看了很多示例,但找不到答案。我需要做的是检查是否有新订单的可用空间。一次我最多可以有 5 个客户。订单时长不受限制,客户只需在picker中选择日期时间范围即可。

例如我的数据库记录是:

`id` `start`            `end`
`1`  `2017/06/10 10:00` `2017/06/15 08:00`
`2`  `2017/06/11 10:00` `2017/06/16 08:00`
`3`  `2017/06/12 10:00` `2017/06/17 08:00`
`4`  `2017/06/13 10:00` `2017/06/18 08:00`
`5`  `2017/06/14 10:00` `2017/06/19 08:00`

客户希望从 2017/06/11 08:00 到 2017/06/15 12:00 进行预订,但我不能让他预订,因为这段时间与我的数据库中的 5 条以上记录重合。如何在 mysql 选择查询中做到这一点?

【问题讨论】:

  • 性能很重要?什么是最小槽粒度?一小时?等一下?一秒?你能对你的cmets更有礼貌吗?我看了你的回答,你看起来很粗鲁,可能是语言问题,但你应该照顾那些正在帮助或试图帮助你的人。
  • 所以(为简洁起见,省略时间和年份),如果 6/1、6/2、6/3、6/4 和 6/5 有单独的非重叠记录;是否允许 6/1 至 6/5 的预订?

标签: php mysql datetime count max


【解决方案1】:

试试:

Select count(*)>5 as vacant
From orders
Where (input_start < end and input_start>start ) or
(Input_end > start and input start<start)

input 是您的搜索值

【讨论】:

  • 当我有更大的持续时间和容量时,这个解决方案是错误的。
【解决方案2】:

您可以使用如下逻辑计算匹配记录的数量:

select count(*)
from t
where $start < end and $end > start;

这会计算与 ($start, $end) 重叠的记录数。您可以在您的应用程序中将比较与“5”放在一起。 (或者只使用select count(*) &lt; 5

注意:您应该将值作为参数传递。

【讨论】:

  • 您需要更准确的选择。如果您在 5 天范围内每天有 4 次预订,则您的选择返回 20,但是,它们是每天第 5 次预订的空间。 (在我看来)
  • 当我有更大的持续时间和容量时,这个解决方案是错误的。
  • @Xinel 。 . .我不知道你为什么认为这是错误的。我读了这个问题,这是在该时间段内获得 5 次重叠的逻辑。也许你的问题不是你想要问的。
  • @Xinel,您应该以最小粒度拆分您的范围并为每个插槽调用查询。如果性能很重要,那么您应该对您的问题更加详细。还解释了槽和槽粒度。并且尽量对你的cmets更有礼貌,你看起来像一个有点粗鲁的人。
【解决方案3】:

试试这样:

select id from table where id not in 
/*the query below will get the wrong result */
(select id from table where yourstartdate between start and end or yourenddate between start and end);

【讨论】:

  • 当我有更大的持续时间和容量时,这个解决方案是错误的。
  • 你说错了可能是因为执行时间很长?因为我认为不是错误的解决方案,但也许您应该考虑在表中放置一些索引以提高性能
【解决方案4】:

有很多,很多解决方案。您已将此标记为 PHP,因此在应用程序逻辑和存储中都有执行此操作的空间。

您可以跨属性(受定义约束)而不是跨行(不受约束)分隔 5 个插槽。然后让应用程序决定事务是否可行(尽管您可以使用视图和触发器将其映射到每个记录的单个槽表示)。

正如其他人所建议的那样,您可以计算当前预订的空位数量以确定是否有空位(但这需要至少进行两次,并且您需要避免出现竞争条件)。出于偏好,这将被实现为插入前触发器。

对此的一种替代方法或增强方法是向包含保留的表添加一个主键/唯一键,其中包括一个枚举列(具有 5 个可能值和一个非空约束),从而无法注入超过 5 条记录一个插槽。

但这一切都是为了防止一种被认为不一致的状态。您的第一道防线是向用户提供不太可能导致此类冲突的选项。明显的情况是不显示已经有 5 个预订的时段。

【讨论】:

    猜你喜欢
    • 2014-05-22
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多