mysql排除整行

qvk1mo1f  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(224)

我有三个表,分别是orders、products和orderproducts,其中products表中有一个status字段表示产品处于活动或非活动状态。只有在所有产品都有效的情况下,我才能显示订单。这意味着如果我有两个产品的订单,而其中一个产品处于非活动状态,我必须跳过显示该行。
考虑以下示例(产品表中的status-1 active,2-inactive)。
订单

+-------------------+
|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     |

我试着加入那些没用的table。非常感谢您的帮助。
谢谢

6ovsh4lw

6ovsh4lw1#

你可以用 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

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

fv2wmkja

fv2wmkja2#

您可以找到至少有一个非活动产品的订单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)
yc0p9oo0

yc0p9oo03#

假设 status = 1 表示活动。
中的内部联接表 orderorderproductsproducts 使用适当的关系。
那么, group byorder_id ,并过滤掉这些命令
having Max() 状态值等于1。
请尝试以下操作:

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

相关问题