【问题标题】:MySQL & PHP approach to a queryMySQL & PHP 查询方法
【发布时间】:2012-08-01 20:48:09
【问题描述】:

我有一个项目表:itemID、itemName 每个项目都可以预订几天;每个项目可以有多个预订;预订永远不会重叠。

预订保存在预订表中:itemID、startDate、endDate

我想指定天数、开始日期和结束日期,然后在提供的开始日期和结束日期之间查找任何未预订期间为该天数或更短的项目。换句话说,我正在寻找给定日期范围内的“短期可用性”项目。然后我想返回每个 itemID 的短期可用性开始和结束日期列表。

我将不胜感激有关如何解决此问题的任何建议,理想情况下是在单个 MySQL 查询中,但使用 PHP 循环进行长期操作是可以的。

到目前为止,我的方法是获取 bookings 表中的所有唯一 itemID,其中包含在提供的开始日期和结束日期之内或之间的预订,然后使用 PHP 和 MySQL 查询的组合解析整个范围,并添加将 itemID 以及“短期期间”的开始和结束日期添加到数组中,但这不是一种优雅的方法。

谢谢

【问题讨论】:

  • 如果您刚刚开始,不会使用像 CodeIgnighter 或 CakePHP 这样的框架让这件事变得更容易吗?
  • 感谢您的建议。我会看看它们,但我认为在这种情况下我想做的是扩展我的 SQL 查询编写能力。
  • 即使使用框架,您仍然会编写大量 SQL。他们的想法是他们会为你做很多日常工作,而且通常比你手工做的要好。

标签: php mysql


【解决方案1】:

这一切都取决于您的日期的结构。如果它们的格式为 DD/MM/YYYY,其中值只是一个 int 03221990,您可以尝试使用简单的大于或小于运算符来隔离可用日期,这一切都可以在查询中完成。这样您就可以找到一系列符合您粗略日期描述的项目,但不一定必须完全符合您的开始日期和结束日期。你的日期是如何安排的?

【讨论】:

  • 在我看来,Unix 时间戳比你所说的更便携。 DATE 类型对于 MySQL 来说也是一个不错的选择。没有理由使用 INT 作为日期。
  • 日期为 MySQL DATE 类型。
【解决方案2】:

您的预订表可能如下所示:

ItemID | booked
23 | 2012-08-01
23 | 2012-08-02
23 | 2012-08-03

项目 23 预订 3 天。因此,在预订项目时添加行。

鉴于每个日期的日期范围为 2012 年 8 月 3 日至 2012 年 8 月 5 日,请选择那些不在预订表中的项目。我不太确定,但我认为这可以通过“完全外部连接”来实现。

【讨论】:

  • 这是一个有趣的想法。这意味着改变表格的结构,但我以后在设计表格时肯定会考虑这种方法。
  • 是的,它有优点也有缺点,但同样值得考虑。它并不适合所有以日期为中心的应用程序,但我喜欢它,因为它使获取数据看起来更容易。谢谢回复。
猜你喜欢
  • 1970-01-01
  • 2013-11-06
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 2018-04-14
  • 1970-01-01
  • 2012-09-03
相关资源
最近更新 更多