【问题标题】:Show product items where no specific orders in a specific time frame显示在特定时间范围内没有特定订单的产品项目
【发布时间】:2017-10-23 09:04:53
【问题描述】:

我有三张桌子:

  • 产品项
  • 订单项
  • 订单

这些表具有以下关联:

OrderItem 属于 OrderOrderItem 属于 ProductItem

Order OrderItem -> ProductItem

订单表有一个delivery_date 和一个pick_up_date 列。

我想获取在特定时间范围内没有订单的ProductItems

我用这个查询尝试过,但它仍然返回 ProductItems,如果它们过去或将来有 Orders

SELECT
    "product_items".*,
    "orders".*
    FROM
        "product_items"
        LEFT OUTER JOIN
            "order_items" ON "order_items"."product_item_id" = "product_items"."id"
            LEFT OUTER JOIN
                "orders" ON "orders"."id" = "order_items"."order_id"
    WHERE
        (
            '2017-10-24' < orders.delivery_date OR
            orders.pick_up_date < '2017-10-23' OR
            orders.id IS NULL
        )

该查询的问题在于它排除了在此特定时间范围内的产品项目。但是,由于产品项目可以在多个订单中,这将不起作用,因为在指定时间范围内不可用的相同产品项目可能在不在此时间范围内的其他订单中。所以他们仍然被退回。

有没有办法只获取特定时间范围内的产品项目并排除存在订单的所有产品项目?

类似这样的:

SELECT ALL PRODUCT ITEMS THAT HAVE NO ORDERS BETWEEN DELIVERY DATE AND PICK UP DATE

我使用 Postgres 作为数据库引擎。

我添加了一个 SQLFiddle 示例 here

我从 6 个小时开始就一直在处理这个问题。感谢您的每一次帮助。

【问题讨论】:

  • 请添加示例数据

标签: sql postgresql


【解决方案1】:

left join 中添加时间框架条件而不是where

类似的东西

SELECT product_items.*,
orders.*
FROM product_items
LEFT OUTER JOIN order_items 
ON order_items.product_item_id = product_items.id
LEFT OUTER JOIN orders 
ON orders.id = order_items.order_id
AND ( '2017-10-24' < orders.delivery_date
    OR orders.pick_up_date < '2017-10-23' )
WHERE orders.id IS NULL

【讨论】:

    【解决方案2】:

    如果您可以提供一些示例数据,以便我重新创建数据库并进行一些测试,我很乐意提供更准确的解决方案。
    同时,试试这个

    SELECT
    "product_items".*,
    "orders".*
    FROM
        "product_items"
        INNER JOIN
            "order_items" ON "order_items"."product_item_id" = "product_items"."id"
        INNER JOIN
            "orders" ON "orders"."id" = "order_items"."order_id"
    WHERE
        (
            product_items.id not in (orders_items.product_item_id) AND
            (whatevertimeframe you'd want)
        )
    

    【讨论】:

    • 我添加了一个示例here。查询不应返回任何记录。提前致谢。
    【解决方案3】:

    试试这个

    SELECT
        product_items.*
    FROM
        product_items
        Inner  JOIN order_items 
            ON order_items.product_item_id = product_items.id
        Inner  JOIN orders 
            ON orders.id = order_items.order_id
    
        WHERE
           (
    ('2017-11-23' <= orders.delivery_date AND orders.delivery_date <= '2017-11-25') OR
    ('2017-11-23' <= orders.pick_up_date AND orders.pick_up_date <= '2017-11-25')
            )
    

    【讨论】:

      猜你喜欢
      • 2020-06-29
      • 1970-01-01
      • 1970-01-01
      • 2017-08-29
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-27
      相关资源
      最近更新 更多