Mysql общая сумма (цена) в корзине из многих таблиц - PullRequest
0 голосов
/ 29 марта 2012

Я встретил, как мне кажется, очень распространенную проблему с 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;
}

Как вы могли заметить, я сделал это безобразно ... может быть, вы можете помочь мне показать, как получить SUM () из возможных N таблиц, считаемых из N.price.

Ответы [ 3 ]

0 голосов
/ 29 марта 2012

Вы можете создать (материализованное) представление только с необходимыми столбцами таблиц продуктов: - product_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;

Если у вас много строк и если цены не меняются часто (каждые несколько минут), я бы предложил создать таблицу изаполнить его результатом вышеупомянутого запроса.

Каждый день или после каждого изменения цены вы можете обновлять эту таблицу.

0 голосов
/ 19 июля 2017

Не ответ, но, 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);
0 голосов
/ 29 марта 2012

Вы можете использовать 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  ....)

Быстрый совет (если вы можете) - объединить все таблицы продуктов в одну таблицу и работать с ней (вам также придется реализовать категории и пользовательские атрибуты).для продуктов, хотя).В противном случае у вас будет беспорядок при добавлении новых магазинов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...