2010-12-19 101 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