减去 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 中选择最新的日期行来解决此问题。

selecthaving 子句中构建了一个小修正,以处理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 表中的值的主要内容,如果未能解决你的问题,请参考以下文章

从mysql中的值中选择

从mysql 5.7中的变量将多行插入表中

根据另一个表中的值从日期列中减去分钟

如何根据同一数据库中的另一个值更改mysql中的值?

从Array1中的特定行值中减去Array2中的行值

从带有条件参数的列表列表中减去列表列表