如果匹配在所有四个表中,则内部仅连接返回值

时间:2014-02-15 23:42:21

标签: mysql sql

我有以下INNER JOIN语句,如果所有四个表都与其中的订单号匹配,则只返回结果。

我需要将每个结果都包含在主表KC_Orders中,而不管INNER JOIN

中每个$sql表的等效内容如何

我知道这是INNER JOIN的重点,但我需要它做其他事情。

  $sql = "SELECT * 
            FROM `KC_Orders` 
                  INNER JOIN `KC_Payments` 
                        ON KC_Orders.orderNumber = KC_Payments.orderNumber  
                  INNER JOIN `KC_OrderStatus`  
                        ON KC_Orders.orderNumber = KC_OrderStatus.orderNumber 
                  INNER JOIN `KC_Statuses` 
                        ON KC_OrderStatus.statusID = KC_Statuses.statusID";
    $AllOrders = $db->query($sql);

2 个答案:

答案 0 :(得分:2)

使用左外连接

SELECT *
FROM
    `KC_Orders`
    LEFT JOIN `KC_Payments`
        ON KC_Orders.orderNumber = KC_Payments.orderNumber
    LEFT JOIN `KC_OrderStatus`
        ON KC_Orders.orderNumber = KC_OrderStatus.orderNumber
    LEFT JOIN `KC_Statuses`
        ON KC_OrderStatus.statusID = KC_Statuses.statusID

如果始终有可用状态,则可以保留KC_Statuses

的内部联接
SELECT *
FROM 
    A
    LEFT JOIN B
        ON A.id = B.id

...表示将返回A中的所有记录,并且仅返回B中与A的记录匹配的记录。即使A中没有匹配的记录,也会返回B的记录。

答案 1 :(得分:1)

听起来你想要一个OUTER JOIN而不是INNER JOIN

如果您想要KC_Orders表中的所有行,那么将该表放在FROM子句中,并在其他表上使用LEFT JOIN。 (不需要OUTER关键字。)这将返回KC_Orders表中的所有行,即使在其他表中找不到匹配的行也是如此。将返回NULL值以代替“缺失”行中的值。

SELECT * 
  FROM `KC_Orders`
  LEFT 
  JOIN `KC_Payments`
    ON KC_Orders.orderNumber = KC_Payments.orderNumber
  LEFT
  JOIN `KC_OrderStatus`
    ON KC_Orders.orderNumber = KC_OrderStatus.orderNumber
  LEFT 
  JOIN `KC_Statuses`
    ON KC_OrderStatus.statusID = KC_Statuses.statusID