MySQL连接两个表,其他表中不存在记录

时间:2016-02-16 05:11:38

标签: mysql join prestashop prestashop-1.5

我有两张桌子

  1. 第一个表名为ps_cart
  2. 第二个表名为ps_orders
  3. ps_cart包含以下列:

    1. id_cart(PK) 等等...
    2. ps_orders有这个列:

      1. id_order(PK)
      2. id_cart
      3. 基本上我想显示所有放弃购物车,即加入两个id_order为空的表。

        我认为这样可以使用OUTER JOIN来实现..

        SELECT cr.id_cart, o.id_order, cr.id_carrier, cr.id_address_delivery, cr.id_customer, cr.date_upd
        FROM ps_cart AS cr
        LEFT OUTER JOIN ps_orders AS o ON cr.id_cart = o.id_cart
        WHERE cr.date_upd BETWEEN "2016-01-01" AND "2016-02-29"
        ORDER BY cr.date_upd DESC
        LIMIT 100;
        

        然而我仍然在id_order不为null的结果(意味着已创建/完成订单)。我期望在id_order上获得null值。

        我可以通过添加WHERE id_order = NULL子句来“欺骗”我的方式,但我觉得这可能不是最好的方法。

        任何人都可以帮助我或向我解释为什么OUTER JOIN没有像我预期的那样工作?我错过了什么吗?

        修改 我知道我想要什么,它是LEFT EXCLUDING JOIN 所以我的查询看起来像这样:

        SELECT cr.id_cart, o.id_order, o.current_state, cr.id_carrier, cr.id_address_delivery, cr.id_customer, cr.date_upd
        FROM ps_cart AS cr
        LEFT JOIN ps_orders AS o ON cr.id_cart = o.id_cart
        WHERE o.id_cart IS NULL
        AND cr.date_upd BETWEEN "2016-02-01" AND "2016-02-29"
        ORDER BY cr.date_upd DESC;
        

        请参阅下面的图片,以便更好地说明我的意思。

        OUTER JOIN

1 个答案:

答案 0 :(得分:0)

基本上联接是搜索某些键

LEFT OUTER JOIN ps_orders AS o ON cr.id_cart = o.id_cart

在这里,它只考虑那些与其他表匹配的cr.id_cart,null将被忽略。