-1

何百万もの製品と価格のデータベースがあります。探しているものを絞り込んでテーブルに表示できるように、SQLステートメントにフィルターを追加しようとしています。私たちがフィルタリングしたかったことのいくつかは、私たちに問題を与えている価格設定に関連しています。

価格はかなり動的であるため、現在、データベース内に保存するのではなく、php関数を使用してリアルタイムで料金を計算しています。現在の価格を関数に渡し、それをテーブルに表示します。

echo profit('99.99'); // output: 12.19

これに伴う問題は、関数を使用してクエリ内でこれらの計算を実行して結果を見つけることができないことです。

$query = "SELECT * FROM `products` WHERE ".profit(."`price` + `shipping` + `acquisition` + `fees`".)." > 10 ";

これを回避する方法はありますか?すべてのテーブル値を反復処理する必要がありますか?データベースが非常に大きいため、これを回避しようとしています。助けてくれてありがとう!

4

4 に答える 4

2

MySQL で関数を作成し、この関数で利益を見積もることができます。

コードを表示していないため、利益関数がどれほど複雑かはわかりません。あなたの「利益」関数が絶えず変化しているなら、それは間違っています。コードは常に変更すべきではなく、その設計を変更する必要がある可能性があります。

いずれにしても、MySQL http://dev.mysql.com/doc/refman/5.0/en/create-procedure.htmlで関数を作成する方法は次のとおりです。

上記のソリューションを使用します。また、利益を示す列に進むこともできます。利益が変わる可能性があるときはいつでも、その列を更新してください。products テーブルがやや大きい場合、これは非常に悪いことです (注: やや大きいとは、10 万行を超えることを意味します)。バッチ プロセスでそれらを更新するだけで、列にインデックスが付けられていない場合は数分ほどかかり、インデックスが付けられている場合はそれほどかかりません。10 万行を超える製品がある場合、それはストアが巨大であることを意味し、列を追加する単純さのために上記のソリューションを使用しない理由はありません。

最悪の場合、関数が非常に複雑で、MySQL が提供するものより強力なものが必要な場合 (これはほとんどありません)、C で関数を作成して MySQL にアタッチできます。ここに私が見つけたチュートリアルがあります。私はそれを検証していませんが、明確で高品質のようです: http://blog.loftdigital.com/blog/how-to-write-mysql-functions-in-c

于 2012-10-04T17:52:26.267 に答える
0

値を取得してアプリケーションで処理する必要があります。PHP 関数を MySQL に渡すことはできません。

可能であれば、同等の操作を実行できる SQL コマンドを使用してください。MySQL は、おそらくあなたが望むことを実行できる多くの関数をサポートしています。

一般に、これが意味することは、profit列を作成し、データを入力し、インデックスを作成してから、クエリで使用する必要があるということです。

SELECT * FROM products WHERE profit > 10

これをどのように設定するかについては、次のように簡単です。

UPDATE products SET profit=(price - shipping - acquisition - fees)

そもそもなぜこれらの数字を合計しているのかは明らかではありません。

于 2012-10-04T17:52:24.347 に答える
0

次のようにSQLを書いたとしましょう:

$query = "SELECT * 
FROM `products` ;

$resultそして、それは次のような名前の2D配列を返します:

array (
"0" => array (
'price'=>100,
'shipping'=>10,
'acquisition'=>10,
 'fees'=>'10'
 ),
"1" => array (
'price'=>200,
'shipping'=>20,
'acquisition'=>20,
 'fees'=>'20'
 )
)

利益を計算する既存の php 関数が 1 つあるので、配列をループすることでこれを行うことができます。

$expectedResult = array();
foreach ($result as $row) {
    if (profit ($row ['price'] + $row ['shipping'] + $row ['acquisition'] +$row ['fees' ) > 10 ) 
        $expectedResult [] = $row ;
}

ここで $expectedResult 配列に必要な行のみを取得します。

:これは解決策ですが、悪い解決策です。良い解決策は次のようになります。

  1. 製品テーブルに利益列があります。
  2. とにかく計算する必要があるため、mysql関数を作成できます。実際にこれを実行したいタイヤは、リソースがどちら側で安いかによって異なります。

これで、あまり変更せずにここであなたのトリックを実行できます:)ハッピーコーディング:)

于 2012-10-04T18:12:19.770 に答える