php
  • mysql
  • sql
  • database
  • 2016-11-27 13 views 0 likes 
    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    |  | 
    
  • +1

    スケールに応じて、 '(LowestNewPrice - LowestUsedPrice/LowestNewPriice * 100)'を列にキャッシュするのはおそらく価値があります。簡単な推測として、これは 'LowestUsedPrice/LowestNewPrice'の整数除算の結果かもしれません。それはあなたのテーブルのスキーマによって異なります。 –

    +0

    キャッシュは計画中ですが、私はこの単純な修正を最初に行う必要があります。私はあまりにもMySQLに精通していない、どのように整数の部門は、ステートメントに影響を与えるだろうか? PHPは現在処理していますが、遅いだけです –

    +0

    整数を最も近い整数に切り捨てます。だから48/50 * 100は(48/50)* 100 = 0 * 100 = 0.として評価される.100 * 48/50は(100 * 48)/ 50 = 4800/50 = 96として評価される。 –

    答えて

    1
    1. あなたが不足しているブラケットは、あなたはまた、整数の除算に実行される場合があります。の前に100 を掛けます。
    関連する問題