私は3つの列を持つテーブル(price_flow)を持っています。基本的には、製品価格の実行を検索するPHPスクリプトは、最後にそれはMySQLのテーブルに新しい行を挿入するとMySql、重複した更新に挿入します。
row_id (int, primary, ai) | product_id (int) | price (int) | update_date (date)
1 | 1234 | 302 | 2016-07-22
2 | 923 | 153 | 2016-07-25
3 | 1234 | 290 | 2016-07-28
4 | 923 | 170 | 2016-07-28
5 | 1111 | 111 | 2016-07-28
...
(それは新しい日の場合)または更新:私は、製品の価格の流れを記録するために使用します行(その日付が商品価格がすでに記録されている場合)。だから、私は "duplicate update"クエリ(テーブルはproduct_id x update_dateにユニークなインデックスを持っています)を使用しました。私のクエリは次のとおりです。
$aid = 1234; //Model ID
$date = date('Y-m-d'); //Current date
$pmin = 210; //Price
$query = "INSERT INTO price_flow (model_id, update_date, price)
VALUES($aid, '$date', $pmin) ON DUPLICATE KEY
UPDATE price=$pmin";
それは正常に動作しますが、価格は同じ製品の他の価格とコヒーレントである場合にのみ、私が今やりたいこと(スクリプトによって得られた結果は、常にではありません更新/挿入価格です正確)。だから私は、価格は前の半分以下にならないと思った。挿入された最後の価格が2倍未満の新価格ではない場合ので、私は(それゆえ、新しい価格が小さいか、最後の価格の半分に等しい)、だから、
$query = "INSERT INTO price_flow (model_id, update_date, price)
SELECT $aid, $date, $pmin FROM price_flow WHERE model_id=$aid AND price<".(2*$pmin)."
ORDER BY date DESC LIMIT 1 ON DUPLICATE KEY
UPDATE price=291 WHERE price <".(2*$pmin).";"
を使用し、それが新しい挿入または更新does't価格。 二つの問題があります:1)クエリの構文が間違っている:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE price <420' at line 1
2)それは、前のレコードを持つ新製品の場合は、新しい行が挿入されていないが(理由はどのようにこのSELECT $aid, $date, $pmin FROM price_flow WHERE model_id=$aid AND price<".(2*$pmin)."
の?私は感謝
**警告**:このコードには、多くの深刻な[SQLインジェクションのバグ](http://bobby-tables.com/)が含まれている可能性があります。可能な限り**準備文**を使用してください。これらは[mysqli](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)と[PDO](http://php.net/manual/)で行うのはかなり簡単です。 en/pdo.prepared-statements.php)ここで、ユーザが提供するデータは '?'または ':name'のインジケータで指定され、後で' bind_param'や 'execute'を使ってデータを入力します。 – tadman