2013-03-02 51 views
1

我有一个连接几个表的查询。在mySQL查询中使用正确的连接

没有选定的列是可以空的,所以最好使用哪种类型的连接?

这里的查询:

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; 

如果我已经成功地得到正确的答案,请让我知道!

+1

我认为内连接总是更好 – DevelopmentIsMyPassion 2013-03-02 14:04:37

+0

最好的连接类型或查询通常取决于您想要实现的内容。该查询看起来非常合理,但我无法知道它是否会按照您的要求进行操作。 – IMSoP 2013-03-02 14:07:13

+0

取决于您的需求 - 您的上述查询可能是您正在寻找的。内连接比外连接快。所以如果这返回你想要的,你的状态很好。 – sgeddes 2013-03-02 14:07:26

回答

2

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

这意味着,你必须确保你orders具有在order_items匹配的行,那么你的order_items行必须等,如果没有,那么你将不会返回任何行匹配items。所以你可能不得不使用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类型。因此,您可以在ordersorder_items之间使用INNER JOIN,但在其他某些表上使用LEFT JOIN。这实际上取决于你的数据以及你试图返回的结果。

1

您正在查看的JOIN类型是LEFT JOIN

说明它更短,INNER 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 

为了进一步获得更多的知识有关加入,请访问以下链接: