基于内连接的MySQL过滤器

时间:2014-11-25 22:00:02

标签: mysql

我有两个表:ProductOrder和ProductOrderStatusHistory。

每个ProductOrder记录都有许多状态历史记录。

每个ProductOrderStatusHistory记录都具有与。

关联的状态和产品订单

我正在循环查看产品订单,我想忽略任何分配了特定状态的订单。这是我到目前为止所做的:

SELECT po.id FROM product_order as po
INNER JOIN product_order_status_history posh ON posh.product_order = po.id
AND posh.order_status <> 5

我的问题是,当我遇到特定状态时,我不知道如何过滤掉整个产品订单。

例如:

 po     | posh status
--------+------------
 126024 | 11
 126024 | 5
 140582 | 6
 140582 | 10

如果我想忽略的状态是5,那么产品订单126024将不会包含在查询结果中。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

尝试将状态条件移动到查询部分

SELECT po.id FROM product_order as po INNER JOIN product_order_status_history posh ON posh.product_order = po.id WHERE posh.order_status <> 5

这应该通过连接表属性过滤您的查询结果。

答案 1 :(得分:0)

尝试NOT EXIST子句:

SELECT po.id FROM product_order as po
WHERE NOT EXISTS(
  SELECT 0 FROM product_order_status_history posh 
  WHERE posh.product_order = po.id
    AND posh.order_status = 5
)

下面是一个连接两个表的版本,但跳过整个产品:

SELECT po.id FROM product_order as po
INNER JOIN product_order_status_history posh ON posh.product_order = po.id
WHERE NOT EXISTS(
      SELECT 0 FROM product_order_status_history posh1 
      WHERE posh1.product_order = po.id
        AND posh1.order_status = 5
    )