0

我对 SQL 编码并不陌生,我只是通常习惯于在 PHP 中从数据库中执行小数据请求,但时不时会遇到需要在哪里连接表的问题,这让我难以理解。我决定通过尝试完成一项任务来扩展我在该领域的知识,但我完全被难住了。

我是从 W3Schools 网站上学习的,所以我所有的参考资料都来自他们位于此处的 TryItEditor 中的数据库:

https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all

我正在尝试使用 SQL 来显示CustomerName以及他们放置的OrderID以及ProductNameProductID

我试图这样做的方式——我知道这可能是错误的,但我对此并不陌生——是使用LEFT JOININNER JOIN来首先加入两列Products.ProductIDOrderDetails.ProductID。然后我也尝试加入OrderDetails.ProductID。最后,尝试将Customers.CustomerID加入Orders.CustomerID

这是我的代码:

SELECT Products.ProductID, OrderDetails.ProductID, Products.ProductName, Customers.CustomerName, Products.ProductName, Orders.OrderID FROM OrderDetails LEFT JOIN Products ON OrderDetails.ProductID = Products.ProductID LEFT JOIN Orders ON OrderDetails.ProductID = Products.ProductID LEFT JOIN Customers ON Customers.CustomerID = Orders.CustomerID;

但是,当我运行此代码时,它显示的是101528行,尽管根据Orders表我清楚地知道总共只有 196 个订单。

我已经尝试通过我在网上找到的各种教程来了解如何做到这一点,但我没有得到我想要的结果。如果有人能指出我正在尝试做的正确方向,将不胜感激!谢谢!

更新: 我想要的输出是查看 196 行(订单数),其中包含以下列:

产品 ID -- ProductName -- CustomerName -- OrderID --

更新内森回答:

SELECT Customers.CustomerID, Orders.OrderID, Products.ProductID, Products.ProductName, Customers.CustomerName FROM Orders INNER JOIN OrderDetails ON OrderDetails.OrderID = Orders.OrderID INNER JOIN Products ON OrderDetails.ProductID = Products.ProductID INNER JOIN Customers ON Customers.CustomerID = Orders.CustomerID

我能够获得所需的视图,但仍然有太多行。

4

1 回答 1

1

从内部连接开始。左连接意味着即使右侧的行不存在,您也会显示左侧的行。可以进行内部联接之后的左联接时间。

拥有 ERD 会有所帮助。如果你还没有,就画一个。选择一个看起来是获取您需要的所有信息的好地方的起始表。联接遵循图中的关系。

我将首先使用订单 ID 加入订单以订购详细信息。然后使用产品 ID 将订单详细信息加入产品。然后通过客户 ID 将订单加入客户。

一次添加一个连接并确认结果有意义。请注意,如果您通过订单 ID 将订单连接到订单详细信息,您将获得与详细信息数量相等的行数,而不是订单数量。

于 2021-02-24T01:54:57.830 回答