我有一个有效的查询:
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/