Используя 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());
}
}
Добавьте уникальный ключ и пусть 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);
Некоторые свободные замечания:
amounts
, вероятно, нужно сделать жизнь сложнее, чем нужно, так как при наличии только метки/даты и времени вы можете легко получить данные из этих настроек, и вы все равно можете используйте все функции даты в исходном поле.