我正在尝试更新较旧的MySQL PHP方法调用,但我最终调用两次相同的SELECT调用以获得相同的结果。有更好的方法吗?
以下是原文:
function updateProbabilities()
{
// first update the word count of each category
$rs = $this->con->select("SELECT category_id, SUM(count) AS total FROM nb_wordfreqs WHERE 1 GROUP BY category_id");
$total_words = 0;
while (!$rs->EOF()) {
$total_words += $rs->f('total');
$rs->moveNext();
}
$rs->moveStart();
if ($total_words == 0) {
$this->con->execute("UPDATE nb_categories SET word_count=0, probability=0 WHERE 1");
return true;
}
while (!$rs->EOF()) {
$proba = $rs->f('total')/$total_words;
$this->con->execute("UPDATE nb_categories SET word_count=".(int)$rs->f('total').",
probability=".$proba."
WHERE category_id = '".$rs->f('category_id')."'");
$rs->moveNext();
}
return true;
}
这是我的版本:
function updateProbabilities() {
$sql = "SELECT category_id, SUM(count) AS total FROM nb_wordfreqs WHERE 1 GROUP BY category_id";
$res = mysql_query($sql) or die (mysql_error());
$total_words = 0;
while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) {
$total_words += $row['total'];
}
if ($total_words >= 1) {
$sql = "SELECT category_id, SUM(count) AS total FROM nb_wordfreqs WHERE 1 GROUP BY category_id";
$res = mysql_query($sql) or die (mysql_error());
while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) {
$proba = $row['total']/$total_words;
$count = (int)$row['total'];
$sql = "UPDATE nb_categories SET word_count=".$count.",
probability=".$proba."
WHERE category_id = '".$row['category_id']."'";
mysql_query($sql) or die (mysql_error());
}
}
else {
$sql = "UPDATE nb_categories SET word_count=0, probability=0 WHERE 1";
mysql_query($sql) or die (mysql_error());
}
return true;
}
您是否看到我可以避免第二次重复的SELECT调用?
答案 0 :(得分:1)
首次运行查询时,将其添加到while循环以存储结果:
$rowarray[] = $row; // added to prevent running it twice
然后第二次出现,替换它:
$sql = "SELECT category_id, SUM(count) AS total FROM nb_wordfreqs WHERE 1 GROUP BY category_id";
$res = mysql_query($sql) or die (mysql_error());
while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) {
用这个:
foreach ($rowarray as $row) {
另外:远离mysql_函数,因为它们已被弃用,很快就会从PHP中删除。更改为PDO或MySQLi。你已经在修改代码了,也可以做出改变。
答案 1 :(得分:1)
等同于$rs->moveStart()
的mysql是:
mysql_data_seek($res, 0);
P.S。如果您要重写为新的API,为什么要使用已弃用的mysql扩展?你应该使用mysqli或PDO?它们有类似的方法来重绕光标。
答案 2 :(得分:-1)
您可以将第一个查询设置为唯一变量,然后重复使用该查询的结果。
function updateProbabilities() {
$sql = "SELECT category_id, SUM(count) AS total FROM nb_wordfreqs WHERE 1 GROUP BY category_id";
$res = mysql_query($sql) or die (mysql_error());
$total_words = 0;
$results = array();
while ($row1 = mysql_fetch_array($res, MYSQL_ASSOC)) {
$total_words += $row1['total'];
$results[] = $row1;
}
if ($total_words >= 1) {
foreach ($results as $row2) {
$proba = $row2['total']/$total_words;
$count = (int)$row2['total'];
$sql = "UPDATE nb_categories SET word_count=".$count.",
probability=".$proba."
WHERE category_id = '".$row2['category_id']."'";
mysql_query($sql) or die (mysql_error());
}
}
else {
$sql = "UPDATE nb_categories SET word_count=0, probability=0 WHERE 1";
mysql_query($sql) or die (mysql_error());
}
return true;
}