【问题标题】:SQL select data from multiple tablesSQL 从多个表中选择数据
【发布时间】:2013-04-30 21:43:31
【问题描述】:

我正在创建一个电子商务商店,其中的 SQL 数据库设置了一个购物车。我设法让购物车工作并在数据库中设置了一些表。我现在在使用不同尺寸的产品时遇到问题,例如衬衫有 3 种不同的尺码,每种尺码也有不同的价格。

这是我的表格的设置方式:

CREATE TABLE products(
        id int(11) NOT NULL auto_increment,
        product_name varchar(255) NOT NULL,
        price varchar(16) NOT NULL,
        details text NOT NULL,
        category varchar(16) NOT NULL,
        subcategory varchar(16) NOT NULL,
        date_added date NOT NULL,
        PRIMARY KEY(id),
        UNIQUE KEY product_name (product_name)
        )

CREATE TABLE admin(
        id int(11) NOT NULL auto_increment,
        username varchar(24) NOT NULL,
        password varchar(24) NOT NULL,
        last_log_date date NOT NULL,
        PRIMARY KEY(id),
        UNIQUE KEY username (username)
        )

CREATE TABLE sizes(
                  SizeID int(11) NOT NULL auto_increment,
                  id int(11) NOT NULL auto_increment,
                  Size varchar(24) NOT NULL,
                  Price varchar(6) NOT NULL,
                  PRIMARY KEY(sizeID),
          UNIQUE KEY ID (ID)

)

我可以从产品表、名称、价格、类别等中获取信息,但我将如何从尺寸表和产品表中选择信息。此信息必须匹配,因此表必须由 FK 链接?

if(isset($_GET['id'])){
    $id = preg_replace('#[^0-9]#i', '', $_GET["id"]);
    //use this var to check to see if this ID exists, if yes then get the product
    //details, if no then ecit this script and give message why
     $sql=mysql_query("SELECT*FROM products WHERE id='$id' LIMIT 1");
     $productCount=mysql_num_rows($sql);//count number of rows in sql variable
     if($productCount>0){
         //get all product details
         while($row=mysql_fetch_array($sql)){

         $id=$row["id"];
         $product_name=$row["product_name"];
         $price=$row["price"];
         $details=$row["details"];
         $category=$row["category"];
         $subcategory=$row["subcategory"];
         $date_added = strftime("%b %d %Y",strtotime($row["date_added"]));
         //product_name, price, details, category, subcategory, date_added
         }
     }else{
           echo "This item does not exist.";
           exit();
         }
}else{
    echo "Data to render this page is missing.";
    exit();
}

这会从产品表中获取数据,但我仍然需要尺寸表中的尺寸和价格,并且它们需要匹配商品 ID。我该怎么做呢?

【问题讨论】:

  • 答案是肯定的。
  • 我建议查看 PDO (php.net/manual/en/book.pdo.php) 并准备好声明,特别是为做一个电子商务网站。
  • 一张表中不能有 2 个自增列。

标签: php mysql sql


【解决方案1】:

从数据库设计的角度来看,您可能需要尺寸和产品之间的多对多关系。而且,如果大小影响价格,您需要将价格存储在多对多表中。

另外,将价格存储为数字,而不是 varchar。你可能想用它做数学。

【讨论】:

  • 我最初存储为 varchar 而不是 int 只是为了可以使用十进制值,我想存储为数字会更有意义
  • 并非所有数字都是整数。
【解决方案2】:

我认为您应该多放一张表(例如 product_sizes):

CREATE TABLE product_sizes(
    product_id int(11),
    size_id int(11)
);

此表会将您的产品与您的尺寸联系起来。 在这种情况下,您的查询将如下所示:

SELECT p.*, s.Size, s.Price 
FROM products AS p, sizes AS s, product_sizes AS ps
WHERE p.id=ps.product_id AND s.id=ps.size_id
AND .... your additional conditions

这是数据库中的多对多关系。

您可以在此处阅读有关这些关系的更多信息:http://sqlrelationship.com/many-to-many-relationship/

【讨论】:

  • 啊,感觉就像我再次在 Uni 处理这个数据库工作,现在一切都回来了,谢谢,我会告诉你进展如何。
  • 看起来每个产品 (ID) 都将映射到多个尺寸(SizeID 和 ID) - 一对多的关系在这里似乎是合理的 - 例如,如果是服装,你不会映射多个产品到大号衬衫的行 - 您只匹配衬衫产品。
  • 将销售的产品将是植物营养素,每个品牌都有不同的尺寸和价格,例如l升售价25英镑,5升售价50英镑,。这里的一对多关系是否合理?
  • 这是您的选择。一对多是当您想在第二个表中复制一些尺寸时
【解决方案3】:

选择 a.name、a.price、a.category、b.price、b.size 从产品 a,尺寸 b 其中 a.id = b.id

所以你要为这个查询设置 $sql

【讨论】:

  • 产品和尺码表之间没有关系。
  • 我的错误 - 我看到 id int(11) NOT NULL auto_increment n 两个表定义并假设它是关系
  • 我现在已经修复了这个问题,所以产品和尺寸表之间存在关系。
  • 当需要多对多关系时,不能直接加入2个表。
猜你喜欢
  • 2021-02-06
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
  • 2022-12-09
  • 1970-01-01
  • 1970-01-01
  • 2016-12-22
  • 1970-01-01
相关资源
最近更新 更多