首页 > 解决方案 > 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

单独使用这些查询,他们完成了他们的工作,但我在总查询中得到一个错误,即这个查询无效。有人可以告诉我我做错了什么以及如何解决这个问题吗?此外,如果有任何改进可以简化查询,请告诉我!

标签: mysqlsql

解决方案


如果你想要一行,你不妨使用两个子查询:

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
       );

请注意,我进行了以下更改:

  • 添加了表别名,因此查询更易于编写和阅读。
  • 限定所有列引用,因此查询是明确的。
  • 替换为inJOIN这似乎是意图。
  • 将双引号替换为字符串分隔符的 SQL 标准单引号。
  • 使用CASE(标准)而不是定制IF()的条件逻辑。

推荐阅读