在mySQL查询中使用正确的Join

时间:2013-03-02 14:01:47

标签: mysql join

我有一个将几个表连接在一起的查询。

所选列都不可为空,因此使用的最佳连接类型是什么?

以下是查询:

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;

如果我已经设法得到正确的答案,请告诉我!

2 个答案:

答案 0 :(得分:2)

您使用的语法是INNER JOIN。这种类型的连接返回每个表中的匹配行。

这意味着您必须确保orders的行与order_items匹配,然后您的order_items行必须与items匹配,等等。如果没有,那么你将不会返回任何行。

所以你可能不得不使用LEFT JOINLEFT 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 JOINorders之间使用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

要进一步了解联接,请访问以下链接: