2016-07-28 11 views
0

私は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)."

の?私は感謝

+0

**警告**:このコードには、多くの深刻な[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

答えて

2

あなたはフラットアウト構文エラーですTWO where句を、持ってこの問題を解決することができますが、on dupe keyに条件付きで、1つのフィールドを更新する必要がある場合は、このようにそれを実行します。

... UPDATE price=IF(price < 2*$pmin, 291, price) 
+0

ありがとう、これは私の最初の問題を解決しました。 –

+0

いいえ。 2つのタイプのクエリを混在させないでください。 mysqlは、そのような選択のために何もない行を実際に作成することはできません。あなたは組合を試すことができますが、メイン・セレクトの結果にかかわらず、常に実行されます。 –

関連する問題