@bisswan

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

У меня есть две таблицы "dogovor" и "catalog", которые имеют одинаковое поле "Name_Product".
В таблице договор есть несколько записей по одному клиенту у которого имеются разные заказанные товары(то есть столбец "Name_Product") с разной стоимостью(столбец "Price").
Мне нужно взять сумму из столбца "Price" таблицы "catalog" и посчитать общую стоимость всех заказов одного клиента и вывести ее.
У меня только получилось вывести цену каждого продукта.
$result7 = $mysql->query("SELECT * from `dogovor` where `id_client` = '$id_client'");
while ($row7 = $result7->fetch_assoc()) {
     $count_dog++;
     $name_product = htmlspecialchars($row7['Name_Product']);
     $result8 = $mysql->query("SELECT * from `catalog` where `Name_Product` = '$name_product' ");

     while ($row8 = $result8->fetch_assoc()) {
         $price = htmlspecialchars($row8['Price_sim']);
         echo $price . "</br>";
     }
};
  • Вопрос задан
  • 318 просмотров
Решения вопроса 1
@alexalexes
/* создание подготавливаемого запроса */
$stmt = $mysql->prepare("select sum(c.`Price`) as price_sum
                             from `dogovor` d
                             join `catalog` c on c.`Id_Product` = d.`Id_Product`
                          where d.`id_client` = ?");
/* связывание параметров с метками */
$stmt->bind_param("i", $id_client);
/* выполнение запроса */
$result = $stmt->execute();
/* выборка результатов */
$row = $result->fetch_accos();
if($row)
{
  echo 'Общая стоимость всех заказов клиента: '.$row['price_sum'];
}
else
{
  echo 'Запрос не дал результата!';
}

Ошибки в вашем решении:
1) Небезопасная подстановка параметров в запросах. Неумение использовать в этой ситуации подготовленные запросы.
2) Использование id_client как строкового параметра, если он состоит из цифр, то целесообразно использовать целочисленный тип в колонке таблицы.
3) Неиспользование агрегированных функций среды sql. Зачем на php плодить лишние циклы, когда сумму можно посчитать "из коробки" средствами самой СУБД? Она под это заточена.
4) Связывание таблиц по наименованию сущности, а не по его идентификатору. Рационально связывать по id_product вместо name_product.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@krchiki
// Выберем все заказы клиента
$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";
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы