2014-02-15 46 views
0

我有以下INNER JOIN語句,並且它只返回結果,如果所有四個表都與它們中的訂單號匹配。Inner如果匹配在所有四個表中,則僅加入返回值

我需要它包括每個結果在主表KC_Orders不管每個INNER JOIN表的等價內容的$sql

我明白,這是內部的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); 
+1

聽起來像你想要一個左/右'外部JOIN' ...? –

回答

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的記錄。即使B中沒有匹配記錄,也會返回A的記錄。

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 
相關問題