Php 在第二个表上选择“带条件”,显示3个表中的信息

Php 在第二个表上选择“带条件”,显示3个表中的信息,php,mysql,Php,Mysql,我试图根据第二个表的寄存器从一个表中进行选择 我用了4张桌子 table Products Product_Id | Product_Name | Product_Value | Category_Id 1 | Ball | 10 | 1 2 | Pen | 2 | 2 3 | E

我试图根据第二个表的寄存器从一个表中进行选择

我用了4张桌子

table Products
Product_Id     |  Product_Name    |   Product_Value   | Category_Id
1              |  Ball            |   10              | 1
2              |  Pen             |    2              | 2 
3              |  Eraser          |    1              | 1

table Categories
Category_Id    |  Category_Name
1              |  Acessories
2              |  Others

table Customers
Customer_Id    |  Customer_Name
1              |  John
2              |  Peter

table Sells
Sell_Id        |  Product_Id      |   Customer_Id   |  Sell_Date
1              |  1               |   1             |  2012-01-01
2              |  2               |   1             |  2012-01-02
所以我想做一个选择,向客户展示他购买的产品

约翰历史

Product Name  Category Name   Date
Ball          Accessories     2012-01-01
Pen           Others          2012-010
在期末考试中,我展示了3个不同表格中的信息

我尝试过使用内部连接和左连接,但没有成功


谢谢您的帮助。

只需在所有这些表上使用JOIN,然后选择您想要的:

SELECT 
    p.Product_Name, c.Category_Name, s.Sell_Date
FROM
    Customers cu JOIN Sells s ON cu.id = s.Customer_Id
    JOIN Products p ON p.id = s.Product_Id     
    JOIN Categories c ON p.Category_Id = c.id
WHERE
    cu.Customer_Name = "John"

JOIN
是否正确:

SELECT Products.Product_Name, Categories.Category_Name, Sells.Sell_Date
FROM Sells JOIN Products ON Sells.Product_Id = Products.Product_Id JOIN Categories ON Sells.Category_Id = Categories.Category_Id
WHERE Sells.Customer_Id = 1;
如果要为单个用户调出历史记录,可以使用WHERE子句:

WHERE Customers.Customer_Id = 1
或者


分解:您首先需要的是产品名称:

SELECT Product_Name FROM Products
我们如何获得类别?加入吧

SELECT Products.Product_Name, Categories.Category_Name 
FROM Products JOIN Categories ON Products.Category_Id = Categories.Category_Id
接近!引入订单历史记录的时间:

SELECT Products.Product_Name, Categories.Category_Name, Sells.Sells_Date 
FROM Products 
JOIN Categories ON Products.Category_Id = Categories.Category_Id
JOIN Sells ON Sells.Sells_Id = Products.Product_Id
现在,我们可以输入名称,并过滤到John:

SELECT Products.Product_Name, Categories.Category_Name, Sells.Sells_Date 
FROM Products 
JOIN Categories ON Products.Category_Id = Categories.Category_Id
JOIN Sells ON Sells.Sells_Id = Products.Product_Id
JOIN Customers ON Sells.Customer_Id = Customers.Customer_Id
WHERE Customers.Customer_Name = 'John'
在你的脑海里,一步一步地走。在运行时从每个部分生成查询

既然你提到了。。。
LEFT JOIN
是处理丢失数据的方法。它从“left”表返回行,如果
ON
子句与
不匹配,则将
NULL
放入“right”表的字段中


例如,如果John购买了一个没有类别的产品(
Product.category\u Id
NULL
),使用
JOIN
将不会返回该购买记录,因为没有与
category\u Id
NULL
匹配的类别。在这种情况下,您可以
左连接类别
,并且在结果集中,
类别名称
也将
为空

非常好,并且一步一步地解释。由于我的错误,我只使用了连接,而两个产品没有类别,因此结果是错误的,更改为左连接,并更改一点查询工作正常。。谢谢大多数答案都是正确的,但你的答案更完整。再次感谢@akatakritos
SELECT Products.Product_Name, Categories.Category_Name 
FROM Products JOIN Categories ON Products.Category_Id = Categories.Category_Id
SELECT Products.Product_Name, Categories.Category_Name, Sells.Sells_Date 
FROM Products 
JOIN Categories ON Products.Category_Id = Categories.Category_Id
JOIN Sells ON Sells.Sells_Id = Products.Product_Id
SELECT Products.Product_Name, Categories.Category_Name, Sells.Sells_Date 
FROM Products 
JOIN Categories ON Products.Category_Id = Categories.Category_Id
JOIN Sells ON Sells.Sells_Id = Products.Product_Id
JOIN Customers ON Sells.Customer_Id = Customers.Customer_Id
WHERE Customers.Customer_Name = 'John'