如果联接表中的行之一与条件不匹配,则mysql排除整行

时间:2018-10-05 11:20:54

标签: mysql sql select

我有三个表,分别是订单,产品和订单产品,其中产品表中有一个状态字段,表示产品处于活动状态或非活动状态。仅当所有产品都处于活动状态时,我才需要显示订单。这意味着如果我有两个产品的订单,而其中一个产品处于非活动状态,则必须跳过显示该行。

请考虑以下示例(状态-1在产品表中处于活动状态,2-在产品表中处于非活动状态)。

订单

+-------------------+
|order_id | column_1|
| 1       | Value 1 |
| 2       | Value 2 |
| 3       | Value 3 |

订购产品

+---------------------+
|id | p_id | order_id |
| 1 |  1   |     1    |
| 2 |  2   |     1    |
| 3 |  1   |     2    |
| 4 |  1   |     3    |

产品

+---------------------+
|id |  name  | status |
| 1 | Prod 1 |    1   |
| 3 | Prod 2 |    2   |

所需的输出

+------------+
|  order_id  | 
|      2     | 
|      3     | 

我尝试加入没有帮助的表。非常感谢您的帮助。

谢谢

3 个答案:

答案 0 :(得分:2)

  • 假设status = 1处于活动状态。
  • 使用适当的关系从orderorderproductsproducts的内部联接表。
  • 然后,在group byorder_id,并筛选出状态为1的订单having Max()

尝试以下操作:

SELECT o.order_id 
FROM orders AS o 
JOIN orderproducts AS op ON op.order_id = o.order_id 
JOIN products AS p ON p.product_id = op.product_id 
GROUP BY o.order_id 
HAVING MAX(p.status) = 1

答案 1 :(得分:1)

您可以使用joingroup byhaving。我假设状态为1表示该产品处于活动状态。所以:

select p.o_id as order_id
from orderproducts op join
     products p
     on op.p_id = p.id
group by op.o_id
having count(*) = sum(p.status = 1);

请注意,orders表不是必需的,因为订单ID在orderproducts中。

您也许可以将having编写为:

having max(p.status) = 1

这假定“活动”状态是可用的最低值。

答案 2 :(得分:0)

您可以找到包含至少一个无效商品的订单ID,并将其从订单列表中排除

SELECT *
FROM orders
WHERE id NOT IN
    (SELECT DISTINCT(orderproducts.order_id)
     FROM orderproducts
     LEFT JOIN products ON orderproducts.p_id = products.id
     WHERE products.status <> 1)