Вложение MySQL запросов в UPDATE или INSERT с PHP

0

Используя MySQL и PHP, я делаю индекс таблицы "суммы" и группирую его по продукту, типу, месяцу, дню и часу. Затем либо обновите соответствующую запись в таблице "количество_меров", либо вставьте новую запись, если она еще не существует.

Вот решение, с которым я столкнулся. Но я не уверен, что это лучший способ сделать это. Любые предложения были бы замечательными.

$sql = "SELECT product, type, month, day, hour, AVG(amount) AS average_amount FROM amounts GROUP BY product, type, month, day, hour";
$result1 = @mysql_query($sql, $con) or die(mysql_error());

while($row = mysql_fetch_array($result1)) {

    $average_amount = $row[average_amount];
    $product = $row[product];
    $type = $row[type];
    $month = $row[month];
    $day = $row[day];
    $hour = $row[hour];

    $sql = "UPDATE amounts_merged SET average_amount = '$average_amount' WHERE product = '$product' AND type = '$type' AND month = '$month' AND day = '$day' AND hour = '$hour'";
        $result2 = @mysql_query($sql, $con) or die(mysql_error());

        $updated_rows = mysql_affected_rows();

        if ($updated_rows == 0) {

            $sql = "INSERT INTO amounts_merged (product, type, month, day, hour, average_amount)
                        VALUES ('$product', '$type', '$month', '$day', '$hour', '$average_amount')";
            $result3 = @mysql_query($sql, $con) or die(mysql_error());


    }

}
  • 0
    Меня все еще поражает, как этот «метод» вызова SQL в PHP все еще выживает спустя годы и годы с гораздо более лучшими решениями.
  • 0
    @Henrik P. Hessel, какие решения вы намекаете?
Показать ещё 4 комментария
Теги:

1 ответ

0
Лучший ответ

Добавьте уникальный ключ и пусть MySQL обработает его:

ALTER TABLE amounts_merged  ADD UNIQUE (product,type,month,day,hour)

В PHP:

 $sql = "INSERT INTO amounts_merged 
    (product,type,month,day,hour,average_amount)
    SELECT product, type, month, day, hour, AVG(amount) AS average_amount
    FROM amounts
    GROUP BY product, type, month, day, hour
    ON DUPLICATE KEY UPDATE average_amount = VALUES(average_amount);"
 mysql_query($sql, $con);

Некоторые свободные замечания:

  • Не указывайте переменные, которые являются целыми числами или плавают (не знаю, являются ли они, но у меня есть мои подозрения...
  • Подготовленные утверждения еще более удобны как для запуска дополнительных запросов обновлений, так и для предотвращения SQL-инъекций.
  • Разделяя столбцы для месяца/даты/часа в исходной таблице amounts, вероятно, нужно сделать жизнь сложнее, чем нужно, так как при наличии только метки/даты и времени вы можете легко получить данные из этих настроек, и вы все равно можете используйте все функции даты в исходном поле.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню