我有一个将几个表连接在一起的查询。
所选列都不可为空,因此使用的最佳连接类型是什么?
以下是查询:
SELECT ir.range_name, it.item_type, oi.itemQuantity, i.item_value
FROM orders o
JOIN order_items oi ON oi.orderId = o.id
JOIN items i ON i.id = oi.itemNumber
JOIN item_types it ON it.id = i.item_type
JOIN item_ranges ir ON ir.id = i.item_name
WHERE o.id = 1;
如果我已经设法得到正确的答案,请告诉我!
答案 0 :(得分:2)
您使用的语法是INNER JOIN
。这种类型的连接返回每个表中的匹配行。
这意味着您必须确保orders
的行与order_items
匹配,然后您的order_items
行必须与items
匹配,等等。如果没有,那么你将不会返回任何行。
所以你可能不得不使用LEFT JOIN
。 LEFT JOIN
将返回orders
表中的所有行,即使表中没有匹配的行也是如此。
SELECT ir.range_name,
it.item_type,
oi.itemQuantity,
i.item_value
FROM orders o
LEFT JOIN order_items oi ON oi.orderId = o.id
LEFT JOIN items i ON i.id = oi.itemNumber
LEFT JOIN item_types it ON it.id = i.item_type
LEFT JOIN item_ranges ir ON ir.id = i.item_name
WHERE o.id = 1;
如果您需要帮助来学习正确的语法,那么这是一个很棒的visual explanation of joins。
注意:您还可以混合使用JOIN
类型。因此,您可以在INNER JOIN
和orders
之间使用order_items
,然后在其他一些表格中使用LEFT JOIN
。这实际上取决于您的数据以及您尝试返回的结果。
答案 1 :(得分:1)
您正在寻找的JOIN类型为LEFT JOIN
。
解释它更短,INNER JOIN
只检索在另一个表上至少有一个匹配值的行。如果要连接两个以上的表,则该行必须在每个表上至少有一个匹配项,以便将记录显示在结果列表中。
但是,LEFT JOIN
显示 LeftHand Side ( ORDERS
表)表中的所有记录,无论记录是否没有匹配的行其他表格。
SELECT ir.range_name, it.item_type, oi.itemQuantity, i.item_value
FROM orders o
LEFT JOIN order_items oi ON oi.orderId = o.id
LEFT JOIN items i ON i.id = oi.itemNumber
LEFT JOIN item_types it ON it.id = i.item_type
LEFT JOIN item_ranges ir ON ir.id = i.item_name
WHERE o.id = 1
要进一步了解联接,请访问以下链接: