0
私のコードをリファクタリングしようとしています。私はすべての行を返して、結果セットをPHPでフィルタリングしていましたが、これはすぐにパフォーマンス上の問題になっています。SQLコマンドでパーセンテージを計算する
現在のコード:
$percentOff = 80;
$stmt = $this->dbh->prepare("SELECT * FROM products WHERE Available=1 AND Merchant='Amazon'"); //Selects all from DB. VERY slow
$finalResults = array();
//Limit the results returned
foreach($rows as $row){
$totalSavings = ($row["LowestNewPrice"] - $row["LowestUsedPrice"])/$row["LowestNewPrice"] * 100;
if($totalSavings >= $percentOff){
$finalResults[] = $row;
}
}
リファクタリングSQL:
$stmt = $this->dbh->prepare("SELECT * FROM products WHERE Available=1 AND Merchant='Amazon' AND (LowestNewPrice - LowestUsedPrice/LowestNewPrice * 100) >= ?");
$stmt->bindValue(1, $percentOff, PDO::PARAM_STR);
これは、ALL products
から返します。私は80以上の結果を返すだけです。どこが間違っていましたか? LowestNewPrice - LowestUsedPrice
DB
| LowestNewPrice | int(11) | NO | | NULL | |
| LowestUsedPrice | int(11) | NO | | NULL | |
スケールに応じて、 '(LowestNewPrice - LowestUsedPrice/LowestNewPriice * 100)'を列にキャッシュするのはおそらく価値があります。簡単な推測として、これは 'LowestUsedPrice/LowestNewPrice'の整数除算の結果かもしれません。それはあなたのテーブルのスキーマによって異なります。 –
キャッシュは計画中ですが、私はこの単純な修正を最初に行う必要があります。私はあまりにもMySQLに精通していない、どのように整数の部門は、ステートメントに影響を与えるだろうか? PHPは現在処理していますが、遅いだけです –
整数を最も近い整数に切り捨てます。だから48/50 * 100は(48/50)* 100 = 0 * 100 = 0.として評価される.100 * 48/50は(100 * 48)/ 50 = 4800/50 = 96として評価される。 –