【问题标题】:fetch only available products in a date range仅获取某个日期范围内的可用产品
【发布时间】:2017-09-09 14:19:35
【问题描述】:

我有两张桌子,一张是订单,另一张是产品。产品类型是出租的,因此物品被发送出租,然后返回。现在,我希望当用户搜索一个日期范围时,比如说 2017 年 6 月 13 日到 2017 年 6 月 21 日,那么只有那些在这些日期范围之间没有任何 orderell 条目的产品应该出现。 如果在 6 月 14 日至 17 日或 6 月 21 日至 23 日或 6 月 11 日至 6 月 15 日预订的产品 a 不应出现。我只希望所选范围不与蚂蚁订单日期冲突。表格顺序有字段(这里只需要提到的字段) 订单表

id product_id from_date   to_date
1   12        2017/04/12  2017/04/21
2   12       2017/05/2    2017/05/8
3   32       2016/12/1    2016/12/7

产品表

id name etc etc
12 p1   23   12
32 p23  22  32

我正在使用 mysql 和 php 在 mysql 查询中(由于某种原因无法显示完整的查询) 有 join bw product 和 orders 表,查询中的 this where 条件

WHERE "2017-04-13"NOT BETWEEN `orders`.`from_date` AND `orders`.`to_date` AND "2017-04-21"NOT BETWEEN `orders`.`from_date` AND `orders`.`to_date` 

正如我所说,这些表之间存在连接。订单表中还有一些其他较旧的订单,因此连接实际上是造成问题的原因。尝试理解“1 - 连接发生::: 获取 product_id 匹配的订单表中的所有行”然后“2- 条件发生在这些范围之间的行将被消除,但不属于此范围的那些范围不会被过滤那么我们还有那个产品”

【问题讨论】:

  • 你能分享你的尝试吗?
  • 这可以在 mysql 或 php 中实现,非常容易,您是否进行了一些研究,您尝试发布您的代码,我们可以找到错误,否则从尝试和编写一些代码开始。跨度>
  • @Gert 我在我的问题中包含了我的查询的一部分
  • @JayBlanchard 我更新了问题

标签: php mysql


【解决方案1】:

我会使用 NOT EXISTS 语句:

select *
from products p
where not exists (
    select *
    from orders o
    where o.product_id = p.id
      and to_date   >= '2017-06-13'
      and from_date <= '2017-06-21'
)

I words:选择所有没有订单且日期范围重叠的产品。

【讨论】:

  • 让我试试这个
【解决方案2】:

用包含用户搜索输入的 php 变量替换静态日期。

选择 * FROM 产品 p INNER JOIN 订单 o ON p.id=o.product_id WHERE (from_date NOT BETWEEN '2017-06-13' AND '2017-06-21') AND(to_date NOT BETWEEN '2017-06-13' AND '2017-06-21') 和 p.id=$pid;

【讨论】:

  • 我已经这样做了,这只是为了向您展示我的工作方式
  • 那是什么问题?
  • 再添加一个条件,检查一下我刚刚编辑了查询。
  • 订单表中还有一些其他较旧的订单,所以连接实际上是在制造问题。尝试理解“1 - 连接发生::: 获取 product_id 匹配的订单表中的所有行”然后“2- 条件发生在这些范围之间的行将被消除,但不属于此范围的那些范围不会被过滤那么我们还有那个产品”
猜你喜欢
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
  • 1970-01-01
  • 1970-01-01
  • 2019-02-23
  • 2013-03-02
相关资源
最近更新 更多