mysql - MySQL联合同一张表的两个查询
问题描述
我有个问题。我创建了这 2 个查询来获取开始值和结束值:
开始值:
SELECT IF(`Order`.action = "Buy", `Order`.transMarketGross, `Order`.transMarketNet) AS startValue
FROM `Order`
WHERE agentId = (SELECT id FROM Agent WHERE owner = "Alexander") AND
`Order`.dateTimeExecuted <= DATE_SUB(curdate(), INTERVAL 1 MONTH)
ORDER BY `Order`.dateTimeExecuted DESC
LIMIT 1;
终值:
SELECT IF(`Order`.action = "Buy", `Order`.transMarketGross, `Order`.transMarketNet) AS endValue
FROM `Order`
WHERE agentId = ( SELECT id
FROM Agent
WHERE owner = "Alexander")
ORDER BY `Order`.dateTimeExecuted DESC LIMIT 1;
但是现在我想要一个结果行中的开始值和结束值,所以我想我可以UNION
在两个查询之间添加:
SELECT IF(`Order`.action = "Buy", `Order`.transMarketGross, `Order`.transMarketNet) AS startValue
FROM `Order`
WHERE agentId = ( SELECT id
FROM Agent
WHERE owner = "Alexander") AND `Order`.dateTimeExecuted <= DATE_SUB(curdate(), INTERVAL 1 MONTH)
ORDER BY `Order`.dateTimeExecuted DESC LIMIT 1
UNION
SELECT IF(`Order`.action = "Buy", `Order`.transMarketGross, `Order`.transMarketNet) AS endValue
FROM `Order` WHERE agentId = ( SELECT id
FROM Agent
WHERE owner = "Alexander")
ORDER BY `Order`.dateTimeExecuted DESC LIMIT 1
单独使用这些查询,他们完成了他们的工作,但我在总查询中得到一个错误,即这个查询无效。有人可以告诉我我做错了什么以及如何解决这个问题吗?此外,如果有任何改进可以简化查询,请告诉我!
解决方案
如果你想要一行,你不妨使用两个子查询:
SELECT (SELECT (CASE WHEN o.action = 'Buy', o.transMarketGross, o.transMarketNet) AS startValue
FROM `Order` o JOIN
Agent a
ON o.agentId = a.id
WHERE a.owner = 'Alexander' AND
o.dateTimeExecuted <= DATE_SUB(curdate(), INTERVAL 1 MONTH)
ORDER BY o.dateTimeExecuted DESC
LIMIT 1
),
(SELECT (CASE WHEN o.action = 'Buy', o.transMarketGross, o.transMarketNet) AS startValue
FROM `Order` o JOIN
Agent a
ON o.agentId = a.id
WHERE a.owner = 'Alexander'
ORDER BY o.dateTimeExecuted DESC
LIMIT 1
);
请注意,我进行了以下更改:
- 添加了表别名,因此查询更易于编写和阅读。
- 限定所有列引用,因此查询是明确的。
- 替换为
in
,JOIN
这似乎是意图。 - 将双引号替换为字符串分隔符的 SQL 标准单引号。
- 使用
CASE
(标准)而不是定制IF()
的条件逻辑。
推荐阅读
- java - 来自 Kotlin 的 Java 接口中声明的异常
- verilog - Verilog 实现一个
我正在尝试理解这段代码,但我无法理解它
// upper bits are always zero assign slt[31:1] = 0; xor (condition, a[31], b[31]); yArith slt_arith (tmp, cout, a, b, 1); yMux #(.SIZE(1)) slt_mux(slt[0], tm
- asp.net - 在 Linux 和 Visual Studio Code 中分析 dotnet 核心
- regex - 正则表达式通过删除部分 URL 来重定向 URL
- python - numpy 如何计算指数?
- c# - 图像在 wpf 的 Gridview 中不可见
- css - 引导按钮和链接的样式冲突
- spring-boot - Gradle > 如何停止使用 gradle bootRun 启动的 Spring Boot 应用程序?
- sql - 在 SQL、Excel、SAS 中取消连接
- python - Pd.DF 在日期时间每小时数据上删除行