使用外部连接将mysql SELECT转换为更新

使用外部连接将mysql SELECT转换为更新,mysql,join,Mysql,Join,我正在尝试更新一个包含股票定价信息的表,以包括这些股票在不同时间段的收益。返回将在时间段的开始处插入。 下面的SELECT语句计算我要查找的3个月和6个月的保留期的值。该表为price\u returns SELECT curr.date, curr.company, curr.price, (mo3.price - curr.price)/curr.price AS 3MONTH_RETURN, (mo6.price - curr.price)/curr.

我正在尝试更新一个包含股票定价信息的表,以包括这些股票在不同时间段的收益。返回将在时间段的开始处插入。 下面的SELECT语句计算我要查找的3个月和6个月的保留期的值。该表为
price\u returns

SELECT 
      curr.date, curr.company, curr.price,
      (mo3.price - curr.price)/curr.price AS 3MONTH_RETURN,
      (mo6.price - curr.price)/curr.price AS 6MONTH_RETURN
FROM 
     price_returns AS curr
LEFT OUTER JOIN 
       price_returns AS mo3
    ON 
       ((curr.date = LAST_DAY(mo3.date - INTERVAL 3 MONTH)) AND (curr.company = mo3.company))
LEFT OUTER JOIN 
       price_returns AS mo6
    ON 
      ((curr.date = LAST_DAY(mo6.date - INTERVAL 6 MONTH)) AND (curr.company = mo6.company))
Order by 
      curr.company, curr.date;
我想将此
SELECT
转换为
UPDATE
到表
price\u returns
中,并将
3MONTH\u RETURN
6MONTH\u RETURN
插入列
ret\u 3mth

这就是我所拥有的,但是它没有正确地执行更新。连接似乎正在工作,因为它匹配了正确的行数,但它不会更改任何行

*更新*

UPDATE 
        price_returns AS curr
LEFT OUTER JOIN 
        price_returns AS mo3
    ON
        ((curr.date = LAST_DAY(mo3.date - INTERVAL 3 MONTH)) AND (curr.company = mo3.company))
LEFT OUTER JOIN 
        price_returns AS mo6    
    ON
        ((curr.date = LAST_DAY(mo6.date - INTERVAL 6 MONTH)) AND (curr.company = mo6.company))
SET 
        curr.ret_3mth = (mo3.price - curr.price)/curr.price,
        curr.ret_6mth = (mo6.price - curr.price)/curr.price;
不知道为什么,但下面的代码现在似乎正在工作。很抱歉给你带来了困惑。我还没有弄清楚到底发生了什么,为什么没有,但现在它正在起作用。我肯定是用户错误

*更新*

UPDATE 
        price_returns AS curr
LEFT OUTER JOIN 
        price_returns AS mo3
    ON
        ((curr.date = LAST_DAY(mo3.date - INTERVAL 3 MONTH)) AND (curr.company = mo3.company))
LEFT OUTER JOIN 
        price_returns AS mo6    
    ON
        ((curr.date = LAST_DAY(mo6.date - INTERVAL 6 MONTH)) AND (curr.company = mo6.company))
SET 
        curr.ret_3mth = (mo3.price - curr.price)/curr.price,
        curr.ret_6mth = (mo6.price - curr.price)/curr.price;

谢谢您的帮助。

您可以使用子查询来完成此操作(http://dev.mysql.com/doc/refman/5.0/en/subqueries.html)


所以在括号中有一个子查询,您将通过上面的整个select代码(第一个mysql代码)

谢谢您的帮助,很高兴看到另一种方法。我刚刚再次尝试了原始代码,它现在可以工作了。我不知道我以前做过什么错事,我试过了。谢谢你的帮助,非常感谢。