如何连接两个MySQL表

时间:2019-02-10 14:40:09

标签: php html mysql

我的MySqli数据库中有一个称为“产品”的表。

Products TABLE 
product_id       | INT      primary KEY
product_name     | VARCHAR(50)
product_price    | float

从PHP中,我像这样在表格产品中输入行:

   mysqli_query($con,"INSERT INTO products (product_id,product_name,product_price) VALUES 
                                           ('$product_id','$product_name','$price')");                                      

到目前为止,所有功能都运行良好。现在,我想要第二个表称为“类别”,该表将包含产品可能具有的所有可能的类别

类别表必须具有category_id和category_name作为列

Category TABLE 
category_id       | INT      primary KEY
category_name     | VARCHAR(50)

我正在尝试找到一种将产品与我的PHP文件中的类别关联的方法

  for example:
  $get=mysqli_query($con, "SELECT * FROM `category`");
  while ($row = mysqli_fetch_assoc($get)) { 
         echo $row['category_name'];   //...here show all the categories
         //...
         //.. pick the category that the product belong
         $category_Selected= .....;
                    }?>
   ..... And make the connection (with INSERT? or something) between product and category

我想在产品表上搜索时(对于产品X)能够显示其所属的类别(到目前为止)(到目前为止,我可以显示Product_id,product_name和product_price )

谢谢

3 个答案:

答案 0 :(得分:0)

您想加入表格。

在这里看看:

Join Tables - w3schools

MySQL Join Tables Syntax

答案 1 :(得分:0)

如果一种产品只能属于一个类别,则可以在“产品”表中添加一个category_id。

我建议第三张桌子:

Product_category
id         | PK
product_id | Foreign key to Products.id
category_id| Foreign key to Categories.id

现在,每次插入产品时,您还需要获取类别的ID,并在Product_category表中插入一条语句。

要检索数据,您可以执行以下操作:

 $get=mysqli_query($con, "SELECT * FROM `category`");
    while ($row = mysqli_fetch_assoc($get)) {

      echo $row['category_name'];   //...here show all the categories

      $products=mysqli_query($con, "SELECT * FROM `Products` WHERE id IN 
      (SELECT product_id from Product_category WHERE category_id= ".(int)$row['category_id'] . ")");

      while ($product = mysqli_fetch_assoc($products)) {

           echo $product["product_name"] . ", " . $product["product_price"]; 

      }
    }

以上语句为例,您可以使用JOIN和预处理语句。

如果您选择更改产品表并在其中添加category_id,则 示例代码如下:

 $get=mysqli_query($con, "SELECT * FROM `category`");
    while ($row = mysqli_fetch_assoc($get)) {

      echo $row['category_name'];   //...here show all the categories
      $products=mysqli_query($con, "SELECT * FROM `Products` WHERE category_id = " . (int) $row["category_id"]);

      while ($product = mysqli_fetch_assoc($products)) {

           echo $product["product_name"] . ", " . $product["product_price"]; 

      }
    }

答案 2 :(得分:0)

实际上,您的数据库不允许您表示类别和产品之间的关系。您将需要更改您的设计。

我可以想象一个产品属于一个类别,并且一个类别可以有多个产品。

如果是这样,我建议创建一个categories表来存储类别,并至少包含category_idcategory_name列。

CREATE TABLE categories (
    category_id INT PRIMARY KEY AUTO_INCREMENT,
    category_name VARCHAR(100)
);

在product表中,您想要在products表中添加一列,该列存储对相应类别ID的引用:

ALTER TABLE products ADD 
    COLUMN category_id INT 
    FOREIGN KEY (category_fk) REFERENCES categories(id) ON DELETE CASCADE;

采用这种经过修改的数据库设计,当您插入products时,您传递了类别的引用(可以期望您的应用程序的用户在创建产品时将从某种下拉列表中选择它。 ):

INSERT INTO products (product_id, product_name, product_price, category_id) 
VALUES ( :product_id, :product_name, :price, :category_id );

当您要显示产品及其类别名称时,可以使用简单的JOIN:

SELECT p.*, c.category_name
FROM products p
INNER JOIN categories c ON c.category_id = p.category_id
WHERE p.produt_id = :product_id

PS:永远不要这样向您的SQL查询传递POST ed值:这会使您遭受SQL注入(并且使查询的可读性和效率降低)。我将查询更改为使用命名参数。