2016-07-28 9 views
0

Ich habe eine Tabelle (price_flow), die 3 Spalten hat. Ich verwende den Preis Fluss von Produkten zu erfassen:MySql, einfügen auf doppelte Aktualisierung, wo

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 
... 

Grundsätzlich, wenn der PHP-Skript, das der Produktpreis läuft suchen, am Ende es in MySQL-Tabelle eine neue Zeile einfügt (wenn es neuen Tag ist) oder die Aktualisierung Zeile (bei diesem Datum wurde der Produktpreis bereits erfasst). Also habe ich eine Abfrage "Bei doppeltem Update einfügen" verwendet (Tabelle hat einen eindeutigen Index für product_id x update_date). Meine Frage ist:

$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"; 

Es funktioniert gut, aber was ich will jetzt tun ist, Update/Insert-Preis nur, wenn der Preis mit den anderen Preisen des gleichen Produkts kohärent ist (Ergebnisse vom Skript gefunden sind nicht immer genau). Also dachte ich, dass der Preis nie weniger als die Hälfte des vorherigen sein wird. So habe ich

$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).";" 

Also, wenn letzten Preis eingeführt ist nicht weniger als das Doppelte der neue Preis (daher neuer Preis ist weniger oder gleich eine Hälfte des letzten Preises), does't es einfügen oder die neue Update Preis. Es gibt zwei Probleme: 1) die Syntax der Abfrage ist falsch:

#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) Wenn es ein neues Produkt ohne vorherige Aufzeichnungen ist, wird die neue Zeile nicht eingefügt (wegen dieser SELECT $aid, $date, $pmin FROM price_flow WHERE model_id=$aid AND price<".(2*$pmin)."

Wie kann ich dieses Problem beheben Dank

+0

** WARNUNG **: Dieser Code hat wahrscheinlich eine Reihe schwerwiegender [SQL-Injektionsfehler] (http://bobby-tables.com/). Wann immer möglich, verwenden Sie ** vorbereitete Aussagen **. Diese sind ziemlich einfach in [mysqli'] (http://php.net/manual/en/mysqli.quickstart.prepared-statements.php) und [PDO] (http://php.net/manual/ en/pdo.prepared-statements.php) wo alle vom Benutzer angegebenen Daten mit einem '?' oder ': name'-Indikator angegeben werden, der später mit' bind_param' oder 'execute' gefüllt wird, je nachdem, welchen du verwendest. – tadman

Antwort

2

Sie haben zwei where Klauseln, die flach-out ein Syntaxfehler Wenn Sie, dass ein Feld in der on dupe key bedingt aktualisieren müssen, tun Sie es dann wie folgt aus:?.

+0

Vielen Dank, dies löste mein erstes Problem, irgendwelche Lösungen auf der zweiten? –

+0

keine Ahnung. sollte wahrscheinlich nicht versuchen, die beiden Arten von Abfragen zu mischen. mysql kann keine Zeilen aus nichts für eine solche Auswahl erstellen. während Sie eine Union versuchen könnten, würde sie IMMER laufen, unabhängig von den Ergebnissen der Hauptauswahl. –

Verwandte Themen