减去 MySQL 表中的值
Posted
技术标签:
【中文标题】减去 MySQL 表中的值【英文标题】:Subtracting values in MySQL Table 【发布时间】:2011-12-01 10:15:29 【问题描述】:我在两个不同的表格中有价格,想减去它们(当前价格-最后一天的价格)并以 DESC 形式订购它们。我想知道是否可以使用单个 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
【问题讨论】:
【参考方案1】: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
【讨论】:
【参考方案2】: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 中的匹配数据。
如果它无法从 table2 中找到匹配的数据,它将用 null
值代替缺失的行。 (left join
)
然后它根据 table1.item name
将 (group by
) 行组合在一起。
这将每个项目组合多行。having
子句通过仅从 table2 中选择最新的日期行来解决此问题。
在select
和having
子句中构建了一个小修正,以处理table2 中没有数据与table1 匹配的情况。
您的查询应该是:
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;
【讨论】:
感谢您的代码,但如果您能稍微解释一下,以便将来对您有所帮助,我将不胜感激:) 我收到以下错误:#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行的 'LIMIT 0, 30' 附近使用正确的语法 @SaadBashir,我的查询没有limit
,请将整个查询复制粘贴到评论中,我会看看。 (顺便说一句,limit 30 offset 0
是查询中的 last 语句,不是 select 子句的一部分)
这是我在 phpmyadmin SQL 控制台区域运行并得到上述错误的确切代码:SELECT a.closing as price1, IFNULL(b.closing,'(no data)') as price2 , (a.closing - IFNULL(b.closing,0)) 作为与股票的差异 a LEFT JOIN stockhistory b ON (a.symbol
= b.symbol
) GROUP BY a.symbol
HAVING IFNULL(b. edate
,'') = MAX(IFNULL(b.edate
,'')
@SaadBashir,该行中没有 limit
子句!因此,MySQL 显然不可能抱怨 limit
附近的语法错误。以上是关于减去 MySQL 表中的值的主要内容,如果未能解决你的问题,请参考以下文章