【问题标题】:To compile a product listing, specifically a price, how can I use two tables to build a total price overall for product?要编制产品清单,特别是价格,我如何使用两张表来构建产品的总价格?
【发布时间】:2013-01-18 05:16:08
【问题描述】:

我正在尝试创建一个购物网站,我在该网站上销售价格每天都在波动的商品(贵金属)。我有一个表(产品),其中包含每个产品的乘数(类似于“1.1”)。我基本上不想每天走进我的桌子并更改数百件商品的价格。我的想法是创建另一个表,我将在其中简单地使用每天的每日价值更改价格字段。我怎样才能使最终产品价格的总和是一个表中的乘数乘以另一个表中输入的每日价格。或者,有没有比使用两个表更好的方法?到目前为止,这里的编码只使用了一个具有定义价格的表:

if (isset($_GET['id'])) {
    //Connect To Mysql Database
    include"storescripts/connect_to_mysql.php";
    $id = preg_replace('#[^0-9]#i','',$_GET['id']);
    //Use This VAR To Check To See If This ID Exists, If Yes Then Get Product
    //Details, If No Then Exit Script and Give Message Why
    $sql = mysql_query("SELECT * FROM products WHERE id='$id' LIMIT 1");
    $productCount = mysql_num_rows($sql);
    if ($productCount > 0) {
        //Get All The Product Details
        while ($row = mysql_fetch_array($sql)) {
            $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"]));
        }

    } else {
        echo "That Item Does Not Exist";
        exit();
    }

} else {
    echo "Data To Render This Page Is Missing";
    exit();
} 

mysql_close();

【问题讨论】:

标签: php mysql sql


【解决方案1】:

那么,不是通常的 mysql_* 相关迂腐的回应怎么样?

在以下架构中,我将材料表与列出的价格分开,以便可以根据日期存储它们。您可能会发现这对记录和/或开具发票很有用。

TABLE products
  prod_id     INT PK
  prod_name   VARCHAR
  prod_price  DECIMAL
  mat_id      INT FK
  ...

TABLE materials
  mat_id    INT PK
  mat_name  VARCHAR
  ...

TABLE material_pricing
  mat_id            INT FK PK
  mat_price_date    DATE PK
  mat_price_factor  DECIMAL

SELECT
  p.prod_name,
  p.prod_price * pr.mat_price_factor AS 'cur_price'
FROM products p INNER JOIN materials m
  ON p.mat_id = m.mat_id
  INNER JOIN material_pricing pr
  ON m.mat_id = pr.mat_id
WHERE mat_price_date = TODAY()

我正在想办法改变查询以获取相关材料的最后定义的 material_pricing 条目,但我很难为子查询排列数据...

编辑:这应该可以解决问题

SELECT
  p.prod_name,
  p.prod_price * pr.mat_price_factor AS 'cur_price'
FROM products p INNER JOIN materials m
  ON p.mat_id = m.mat_id
  INNER JOIN (
    SELECT p1.*
    FROM material_pricing p1 INNER JOIN (
      SELECT mat_id, MAX(mat_price_date) 'mat_price_date'
      FROM material_pricing
      WHERE mat_price_date <= $target_date
      GROUP BY mat_id
    ) p2
    ON p1.mat_id = p2.mat_id
      AND p1.mat_price_date = p2.mat_price_date
  ) pr
  ON p.mat_id = pr.mat_id

其中最内层子查询中的$target_date 将替换为今天的日期、TODAY() mySQL 函数或正在显示的发票日期。

【讨论】:

  • 完美使用mysql_query!
  • @Smandoli 更迂腐! $target_date,或:target_date,或?,或任何你喜欢的具体实现
  • 我不能声称已经查看了您的答案,但我赞成,因为架构更改必须按顺序进行,因此您指向正确的方向,并且您正在提供解释和支持。 (你的意思是“纯粹的”迂腐吗?)
猜你喜欢
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多