我有以下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);
答案 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