仅提取日期范围内的可用产品

时间:2017-04-13 12:40:57

标签: php mysql

我有两个表,一个是订单,另一个是产品。产品类型是租赁所以物品发送出租然后返回。现在,我希望当用户搜索日期范围时,请说明2017年6月13日至2017年6月21日,那么只有那些产品应该出现在这些日期范围之间没有订单的任何条目。 如果它预定于6月14日至6月14日或6月23日或6月6日至6月15日,则不应出现。所有我想要的选择范围不应与蚂蚁订单日期相符。表顺序有字段(这里只提到需要的字段) 订单表

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查询中(由于某种原因无法显示完整查询) 有加入bw产品和订单表,这是查询中的条件

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 - 条件发生我们的行落在这些范围之间被消除但不属于此范围的那些范围不会被过滤那我们还有那个产品“

2 个答案:

答案 0 :(得分:2)

我会使用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'
)

我的话:选择所有没有重叠日期范围的订单的产品。

答案 1 :(得分:0)

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

SELECT *
FROM product p INNER JOIN orders 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')
AND p.id=$pid;