2011-10-05 80 views
6

我有两个不同表格的价格,并且想要减去它们(当前价格 - 最后一天价格)并以DESC形式对它们进行排序。我想知道是否可以使用单个MySQL命令完成。在MySQL中减去值表

表结构

Table 1 
id | Item Name | Date  | Price 
1 | alpha  | 2011-10-05 | 10 
2 | beta  | 2011-10-05 | 12 
3 | gamma  | 2011-10-05 | 14 

Table 2 
id | Item Name | Date  | Price 
1 | alpha  | 2011-10-04 | 8 
2 | beta  | 2011-10-04 | 10 
3 | gamma  | 2011-10-04 | 12 
4 | alpha  | 2011-10-03 | 4 
5 | beta  | 2011-10-03 | 6 
6 | gamma  | 2011-10-03 | 8 

回答

5
SELECT 
table1.id, table1.`Item Name`, 
table1.`Date` AS CurrDate, table1.Price AS CurrPrice, 
table2.`Date` AS PrevDate, table2.Price AS PrevPrice, 
table1.Price - table2.Price AS Difference 
FROM table1 
LEFT JOIN table2 ON table1.id = table2.id AND table1.`Date` - INTERVAL 1 DAY = table2.`Date` 
ORDER BY Difference DESC 

没有什么特别之处,除了查询我用过的LEFT JOIN的方式。我相信如果昨天的记录速度不可用,最后三列将包含NULL。输出:

id | Item Name | CurrDate | CurrPrice | PrevDate | PrevPrice | Difference 
2 | beta  | 2011-10-05 | 12  | 2011-10-04 | 10  | 2 
3 | gamma  | 2011-10-05 | 14  | 2011-10-04 | 12  | 2 
1 | alpha  | 2011-10-05 | 10  | 2011-10-04 | 8   | 2 
+0

works!thanks:D –

4
SELECT 
    a.price as price1 
    , IFNULL(b.price,'(no data)') as price2 
    , (a.price - IFNULL(b.price,0)) as difference 
FROM table1 a 
LEFT JOIN table2 b ON (a.`item name` = b.`item name`) 
GROUP BY a.`item name` 
HAVING IFNULL(b.`date`,'') = MAX(IFNULL(b.`date`,'') 

下面是它如何工作的。

它从2个表中选择数据:来自表1的所有数据和来自表2的匹配数据。
如果它无法从表2中找到匹配的数据,它将用null值代替缺失的行。 left join

然后,它基团group by行一起基于table1.item name
这将每个项目组合多行。
having子句通过仅从表2中选择最新的日期行来修复此问题。

小幅盘整是建设成selecthaving的条款来处理的情况时有表2中没有数据来匹配表1。

您的查询应该是:

SELECT 
    s.closing as price1 
    , IFNULL(sh.closing,'(no data)') as price2 
    , (s.closing - IFNULL(sh.closing,0)) as difference 
FROM stocks s 
LEFT JOIN stockhistory sh ON (s.symbol = sh.symbol) 
GROUP BY s.symbol 
HAVING IFNULL(sh.edate,'') = MAX(IFNULL(sh.edate,'') 
LIMIT 30 OFFSET 0; 
+0

感谢您的代码,但我真的很感激,如果你能解释一下它有点太使其在未来有帮助:) –

+0

我收到以下错误: #1064 - 你有一个您的SQL语法错误;检查对应于您的MySQL服务器版本的手册,以在第2行的'LIMIT 0,30'附近使用正确的语法 –

+0

@SaadBashir,我的查询没有'limit',请将整个查询复制粘贴到评论中我会看看。 (顺便说一下'limit 30 offset 0'是查询中的** last **语句,而不是select子句的一部分) – Johan