代码之家  ›  专栏  ›  技术社区  ›  웃웃웃웃웃

如果联接表中的某一行与条件不匹配,Mysql将排除整行

  •  1
  • 웃웃웃웃웃  · 技术社区  · 7 年前

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

    订单

    +-------------------+
    |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 回复  |  直到 7 年前
        1
  •  1
  •   Gordon Linoff    7 年前

    你可以用 join , group by having

    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 max(p.status) = 1
    

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

        2
  •  2
  •   Madhur Bhaiya    7 年前
    • 假设 status = 1
    • 中的内部联接表 order orderproducts products 使用适当的关系。
    • 那么, group by order_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
    
        3
  •  0
  •   Maksym Fedorov    7 年前

    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)