我有三个表,分别是订单,产品和订单产品,其中产品表中有一个状态字段,表示产品处于活动状态或非活动状态。仅当所有产品都处于活动状态时,我才需要显示订单。这意味着如果我有两个产品的订单,而其中一个产品处于非活动状态,则必须跳过显示该行。
请考虑以下示例(状态-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 |
我尝试加入没有帮助的表。非常感谢您的帮助。
谢谢
答案 0 :(得分:2)
status = 1
处于活动状态。 order
到orderproducts
到products
的内部联接表。group by
上order_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)
您可以使用join
,group by
和having
。我假设状态为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)