MySQL 变量作为带有其他表元素的子查询的结果

标签 mysql

我有一个有效的查询:

SELECT count(*),
       AVG(
             (SELECT sum(order_fills.quant * order_fills.price)
              FROM order_fills
              WHERE `type`='closed'
                AND order_fills.transaction_id = transactions.id) -
             (SELECT sum(order_fills.quant * order_fills.price)
              FROM order_fills
              WHERE `type`='opened'
                AND order_fills.transaction_id = transactions.id)) AS avgProfit,
       SUM(
             (SELECT sum(order_fills.quant * order_fills.price)
              FROM order_fills
              WHERE `type`='closed'
                AND order_fills.transaction_id = transactions.id)) AS volume,
FROM transactions
WHERE transactions.status='closed';

为了使代码更具可读性,我希望将该查询的某些部分设置为变量。

我希望实现类似的目标(它不起作用,返回null):

SET @transSells =
          (SELECT sum(order_fills.quant * order_fills.price)
           FROM order_fills
           WHERE type='closed'
             AND order_fills.transaction_id = transactions.id);


SET @transBuys =
          (SELECT sum(order_fills.quant * order_fills.price)
           FROM order_fills
           WHERE type='opened'
             AND order_fills.transaction_id = transactions.id);


SELECT avg(@transSells - @transBuys) AS `avgProfit`,
       sum(@transSells + @transBuys) AS `volume`
FROM transactions WHERE transactions.status='closed'

我认为问题可能是子查询WHERE语句的一部分是主查询和另一个表(transactions.id)的结果:

AND order_fills.transaction_id = transactions.id

最佳答案

变量查询不起作用的原因是变量定义的 WHERE 子句中的 transactions.id 未定义 (NULL) >),因此查询不会返回任何结果。

我认为您可以通过使用条件聚合将变量放入派生表中来简化查询,然后JOIN到:

SELECT AVG(transSells - transBuys) AS avgProfit,
       SUM(transSells + transBuys) AS volume
FROM transactions
JOIN (SELECT transaction_id,
             SUM(CASE WHEN type='closed' THEN quant * price ELSE 0 END) AS transSells,
             SUM(CASE WHEN type='opened' THEN quant * price ELSE 0 END) AS transBuys
      FROM order_fills) o ON o.transaction_id = transactions.id
WHERE status = 'closed'

关于MySQL 变量作为带有其他表元素的子查询的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55756410/

相关文章:

php - 更改数据库或打开新连接是否更密集?

mysql - 什么时候使用多重索引?何时使用力量指数?

MYSQL myisam 使用 keycache 修复

mysql - 将Pentaho演示数据库修改为MySQL后,管理控制台损坏

c# - Entity Framework 和 MariaDB - phpMyAdmin

mysql - 德银数据库中的商店产品选项在哪里

php - 为什么我的 tmp_file_upload 文件不存在?我正在使用 php 5.6

php - 根据用户电子邮件进行 id 查找查询

MySQL:导入时 key 名称重复

mysql - 异常高的 MySQL 写入和大于正常的二进制日志文件。我如何确定是什么原因造成的?