2010-12-19 102 views
0

我想與一個MySQL查詢的幫助:比較兩個表中的值,並更新表1表2是否具有較高的價值

  • 對於max(id)每個transaction.position行,其中t_type = 'buy'
  • 獲取從表quotes2010(基於所述transactions.symbol
  • 最近(按日期)價格IF價格爲符號比在transactions.high列中的價格
  • 減去0.01從第更高Ë更高quotes2010.price
  • 更新更高的價格在transactions.high

。 。 。 。在一個查詢中。

我想要做的最基本的事情就是更新表格,如果第二個表格中符號的價格更高。這裏是數據庫結構的基本版本:

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

從表和插入語句中缺少列「位置」。 – Ronnis 2010-12-19 18:49:26

+0

您的CREATE TABLE轉儲正確 - 事務處理中沒有位置字段。另外,請提供更具代表性的測試數據以測試所需的限制條件。 – Riedsio 2010-12-19 18:50:29

+0

你們都是對的。我在這裏是新的,我只是試圖剝離桌子結構(試圖更清楚)。將來,我會做得更好。 – Drewneedshelp 2010-12-20 04:53:33

回答

0

您的模式和數據集是有限的,但我認爲這將做你所需要的。

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

謝謝!這個答案效果很好!我只是刪除了引用quotes2010表的行(因爲我從不想更新該表)。我需要在用另一個查詢更新之前修改高價格(以一種相當複雜的方式)。我已經有一個工作查詢,我只是不知道如何將它集成到上面的成功查詢中。我應該爲此提出另一個問題,還是將它附加在這裏? – Drewneedshelp 2010-12-20 04:56:42

+0

太棒了。取決於我認爲其他問題的相關程度。如果你不能把它整合到這個中,那麼一個新的就是IMO。 – Riedsio 2010-12-20 13:45:37