2010-12-19 5 views
0

hat ich Hilfe mit einer MySQL-Abfrage möchten, dass:Vergleichen Werte in zwei Tabellen und Update table1 wenn table2 einen höheren Wert

  • Für die max(id) für jede transaction.position Zeilen, in denen t_type = 'buy'
  • Gets jüngster (nach Datum) Preis vom quotes2010 Tabelle (basierend auf den transactions.symbol)
  • , wenn der Preis für das Symbol ist höher als der Preis in der transactions.high Spalte
  • subtrahiert 0,01 von th e höher quotes2010.price
  • Aktualisieren Sie den höheren Preis in der transactions.high Spalte

. . . . in einer einzigen Abfrage.

Die einfachste Sache, die ich versuche, ist, aktualisieren Sie eine Tabelle, wenn der Preis für das Symbol in der zweiten Tabelle höher ist. Hier ist eine grundlegende Version der Datenbankstruktur:

CREATE TABLE IF NOT EXISTS `transactions` (
    `id` int(10) unsigned NOT NULL auto_increment, 
    `symbol` char(8) NOT NULL, 
    `high` double(8,2) NOT NULL, 
    `t_type` enum('buy','sell') NOT NULL, 
    `t_date` datetime NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `position` (`position`,`id`), 
    KEY `t_date` (`t_date`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

INSERT INTO `transactions` VALUES(1, 'AO1', 1.35, '2010-12-12 00:08:57'); 

CREATE TABLE IF NOT EXISTS `quotes2010` (
    `symbol` char(8) NOT NULL, 
    `price` double(8,2) NOT NULL, 
    `date` datetime NOT NULL, 
    PRIMARY KEY (`symbol`,`date`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

INSERT INTO `quotes2010` VALUES('A01', 1.40, '2010-12-19 10:03:05'); 
+1

Spalte "Position" fehlt in Tabelle und Anweisung einfügen. – Ronnis

+0

Ihr CREATE TABLE-Dump ist korrekt - es gibt kein Positionsfeld für Transaktionen. Stellen Sie außerdem Testdaten bereit, die repräsentativer sind, um die gewünschten Einschränkungen zu testen. – Riedsio

+0

Sie sind beide richtig. Ich bin neu hier, und ich habe nur versucht, die Tischstruktur zu streichen (um klarer zu sein). In Zukunft werde ich es besser machen. – Drewneedshelp

Antwort

0

Ihr Schema und Dataset sind begrenzt, aber ich denke, das wird tun, was Sie brauchen.

UPDATE 
quotes2010 INNER JOIN 
(
    SELECT symbol, MAX(date) AS max_date 
    FROM quotes2010 
    GROUP BY symbol 
) quote_by_maxdate ON quote_by_maxdate.symbol=quotes2010.symbol AND quote_by_maxdate.max_date=quotes2010.date 
INNER JOIN transactions ON quotes2010.symbol = transactions.symbol 
INNER JOIN 
(
    SELECT symbol, MAX(id) AS max_id 
    FROM transactions 
    WHERE t_type='buy' 
    GROUP BY symbol 
) transactions_by_max_id ON transactions.id=transactions_by_max_id.max_id 
SET quotes2010.price = IF(quotes2010.price > transactions.high,quotes2010.price-0.01,quotes2010.price), 
transactions.high = IF(quotes2010.price > transactions.high,quotes2010.price,transactions.high) 
+0

DANKE !!! Diese Antwort hat super funktioniert! Ich musste einfach die Zeile entfernen, die die quotes2010-Tabelle udpated (weil ich diese Tabelle nie aktualisieren möchte). Ich muss den hohen Preis (in einer etwas komplizierten Weise) ändern, bevor es mit einer anderen Frage aktualisiert wird. Ich habe bereits eine funktionierende Anfrage, ich weiß einfach nicht, wie ich sie in die obige erfolgreiche Anfrage integrieren kann. Soll ich dafür noch eine Frage stellen oder sie hier anhängen? – Drewneedshelp

+0

Ehrfürchtig. Hängt davon ab, wie verwandt die anderen Fragen sind, nehme ich an. Wenn Sie es nicht in dieses integrieren können, dann macht ein neues IMO Sinn. – Riedsio

Verwandte Themen