我正在尝试创建一个cron作业,该作业将从事务表中选择点的总和。
根据积分总和和员工id,我必须更新总分表。我想确保我使用的是最好的方法,而且这会奏效。
<?php
$conn = mysql_connect("localhost", "mysql_user", "mysql_password");
if (!$conn) {
echo "Unable to connect to DB: " . mysql_error();
exit;
}
if (!mysql_select_db("mydbname")) {
echo "Unable to select mydbname: " . mysql_error();
exit;
}
$sql = "SELECT ID, SUM(POINTS) as Points, FROM Transactions WHERE Status = 1 Group By ID";
$result = mysql_query($sql);
if (!$result) {
echo "Could not successfully run query ($sql) from DB: " . mysql_error();
exit;
}
if (mysql_num_rows($result) == 0) {
echo "No rows found, nothing to print so am exiting";
exit;
}
while ($row = mysql_fetch_assoc($result)) {
mysql_query("UPDATE Totals SET Points=" + $row["Points"] + "WHERE ID=" + $row["id"]);
}
mysql_free_result($result);
?>
您仍然可以在UPDATE
语句上联接表(和子查询)。试试这个,
UPDATE Totals a
INNER JOIN
(
SELECT ID, SUM(POINTS) as Points,
FROM Transactions
WHERE Status = 1
Group By ID
) b
ON a.ID = b.ID
SET a.Points = b.Points
希望这能有所帮助。
使用PDO扩展(代码段)的示例。
<?php
$query = "UPDATE Totals a
INNER JOIN
(
SELECT ID, SUM(POINTS) as Points,
FROM Transactions
WHERE Status = ?
Group By ID
) b
ON a.ID = b.ID
SET a.Points = b.Points";
$iStatus = 1;
$stmt = $dbh->prepare($query);
$stmt->bindParam(1, $iStatus);
$stmt->execute();
?>
PDO手册
PDO准备声明
为什么不能在通过cron作业运行脚本之前先测试它?我看不出语法有什么错误;但话说回来,我只是匆匆看了一眼,我不知道你的桌子结构是什么样的。
如果您正在寻找最好的方法,那么您应该考虑使用mysqli或PDO,而不是mysql函数。这样,您就可以使用准备好的语句,如果您计划在循环中运行多个查询,那么这对DBMS来说就不会那么费力了。准备好的语句不需要单独往返于服务器,而旧的mysql函数则需要。