Mysql多表购物车中的总金额(价格)

Mysql多表购物车中的总金额(价格),mysql,sum,Mysql,Sum,我遇到了一个我认为mysql和电子商务商店非常常见的问题。。。虽然我找不到答案 我有一个商店,它没有一个产品表,但有很多。。。例如,在一家商店里有乙烯基、摄影器材等。。。所以我们有很多不同产品细节的表格。。。问题是我需要从许多表中获取购物车中产品的总数量(价格) public static function GetTotalAmount() { $params = array( ':cart_id' => self::GetCartId() ); $

我遇到了一个我认为mysql和电子商务商店非常常见的问题。。。虽然我找不到答案

我有一个商店,它没有一个产品表,但有很多。。。例如,在一家商店里有乙烯基、摄影器材等。。。所以我们有很多不同产品细节的表格。。。问题是我需要从许多表中获取购物车中产品的总数量(价格)

public static function GetTotalAmount() {
    $params = array(
        ':cart_id' => self::GetCartId()
    );
    $sql = 'SELECT SUM(v.price) AS total_amount '.
            'FROM shopping_cart sc '.
            'INNER JOIN vinyl v '.
            'ON sc.product_id = v.id  AND sc.department_id = 1 '.
            'WHERE sc.cart_id = :cart_id AND sc.buy_now;';
    $v = DataBase::FetchOne($sql, $params);
    $sql = 'SELECT SUM(sg.price) AS total_amount '.
            'FROM shopping_cart sc '.
            'INNER JOIN studio_gear sg '.
            'ON sc.product_id = sg.id  AND sc.department_id = 2 '.
            'WHERE sc.cart_id = :cart_id AND sc.buy_now;';
    $sg = DataBase::FetchOne($sql, $params);
return $sg + $v;
}
正如你可能看到的,我是用丑陋的方式做的。。也许你可以帮我演示如何从N.price中计算出可能N个表的SUM()

您可以使用UNION ALL

 SELECT SUM(price) FROM ((SELECT SUM(price) as price FROM table1 WHERE ...) UNION ALL (SELECT SUM(price) as price FROM table2 WHERE ...) UNION ALL  ....)
一个快速提示(如果可以的话)-将所有products表合并到一个表中并对其进行操作(不过您还必须实现产品的类别和自定义属性)。否则,当您添加新店铺时,您将陷入混乱。

您可以创建一个(物化)视图,其中只包含产品表的必要列、
product\u id
price

一旦你有了视图(
vw_products
),你就可以将购物车表与视图进行内部连接,然后得到总和

SELECT sum(vw.price) FROM
shopping_cart sc INNER JOIN vw_products vw 
ON sc.product_id = vw.id and sc.department_id IN (1,2,...)
WHERE sc.cart_id = :cart_id AND sc.buy_now;
如果您有很多行并且价格不经常变化(每隔几分钟) 我建议创建一个表并用上面查询的结果填充它


每天或每次更改价格后,您都可以刷新此表

不是答案,但是,FWIW,我觉得这更容易阅读

$sql = "
SELECT SUM(v.price) total_amount 
  FROM shopping_cart sc 
  JOIN vinyl v 
    ON sc.product_id = v.id  
   AND sc.department_id = 1 
 WHERE sc.cart_id = :cart_id 
   AND sc.buy_now;
";

$v = DataBase::FetchOne($sql, $params);

非常感谢!我将把产品合并到一个表中