Как объединить данные из таблицы по общему столбцу и вычислить их сумму?

Как посчитать общую стоимость всех заказов одного клиента, учитывая, что в таблицах "dogovor" и "catalog" есть поля с названием товара и его ценой?
  • 14 апреля 2024 г. 13:09
Ответы на вопрос 3
Для объединения данных из таблицы по общему столбцу и вычисления их суммы, можно использовать оператор JOIN в SQL запросе. Например, если у нас есть таблицы "dogovor" и "catalog", и мы хотим посчитать общую стоимость всех заказов одного клиента, то можно выполнить следующий запрос:

SELECT SUM(catalog.price) AS total_price
FROM dogovor
JOIN catalog ON dogovor.product_name = catalog.product_name
WHERE dogovor.client_name = 'Имя клиента';

В данном запросе мы соединяем таблицы "dogovor" и "catalog" по полю с названием товара. Затем мы выбираем сумму цен товаров из таблицы "catalog" для всех заказов, сделанных определенным клиентом (задаем имя клиента в условии WHERE).

Таким образом, после выполнения этого запроса, мы получим общую стоимость всех заказов одного клиента.
// Выберем все заказы клиента
$result7 = $mysql->query("SELECT * FROM `dogovor` WHERE `id_client` = '$id_client'");

// Переменная для хранения общей стоимости заказов
$total_price = 0;

// Пройдемся по каждому заказу клиента
while ($row7 = $result7->fetch_assoc()) {
    $name_product = htmlspecialchars($row7['Name_Product']);
    
    // Выберем стоимость товара из каталога
    $result8 = $mysql->query("SELECT `Price_sim` FROM `catalog` WHERE `Name_Product` = '$name_product'");
    
    // Переменная для хранения стоимости конкретного заказа
    $order_price = 0;
    
    // Если нашли товар в каталоге
    if ($row8 = $result8->fetch_assoc()) {
        // Добавляем стоимость товара к общей стоимости заказа
        $order_price = $row8['Price_sim'];
    }
    
    // Добавляем стоимость текущего заказа к общей стоимости всех заказов клиента
    $total_price += $order_price;
}

// Выводим общую стоимость всех заказов клиента
echo "Общая стоимость всех заказов клиента: $total_price";
/* создание подготавливаемого запроса */
$stmt = $mysql->prepare("select sum(c.`Price_sim`) as price_sim_sum
                                            from `dogovor` d
                                            join `catalog` c on c.`Id_Product` = d.`Id_product`
                                           where `id_client` = ?");
/* связывание параметров с метками */
$stmt->bind_param("i", $id_client);
$result = $stmt->execute();
$row = $result->fetch_accos();
if($row)
{
  echo 'Общая стоимость всех заказов клиента: '.$row['price_sim_sum'];
}
else
{
  echo 'Запрос не дал результата!';
}

Ошибки в вашем решении:
1) Небезопасная подстановка параметров в запросы. Неумение использовать в этой ситуации подготовленные запросы.
2) Использование id_client как строкового параметра, если он состоит из цифр, то целесообразно использовать целочисленный тип в колонке таблицы.
3) Неиспользование агрегированных функций среды sql. Зачем на php плодить лишние циклы, когда сумму можно посчитать "из коробки"?
4) Связывание таблиц по наименованию сущности, а не по его идентификатору. Рационально связывать по id_product вместо name_product.
Похожие вопросы