MySQL在一个查询中同时选择同一列的SUM和一个特定行-最佳方式?

MySQL在一个查询中同时选择同一列的SUM和一个特定行-最佳方式?,mysql,sql,optimization,subquery,Mysql,Sql,Optimization,Subquery,嗯,这个问题可能看起来不太明智,因为我解决了我的问题。我只是好奇有没有更好的办法。我写了这个查询: SELECT SUM(`attr`) AS `attrsum`, (SELECT `attr` FROM `table` WHERE `id`=XXX AND `specialcondition`=YYY) AS `attr` FROM `table` WHERE `id`=XXX 它绝对有效,我想做什么就做什么,但我不确定——这是最好的方法

嗯,这个问题可能看起来不太明智,因为我解决了我的问题。我只是好奇有没有更好的办法。我写了这个查询:

SELECT 
    SUM(`attr`) AS `attrsum`, 
    (SELECT `attr` FROM `table`
     WHERE `id`=XXX AND `specialcondition`=YYY) AS `attr` 
FROM 
    `table` 
WHERE 
    `id`=XXX

它绝对有效,我想做什么就做什么,但我不确定——这是最好的方法吗?我的意思是子查询仍然像另一个查询,所以我怀疑这是获取这些数据的最佳方式。另一方面,我不知道怎样才能做得更好。或者这是最好的方法,并且在我的查询中一切都很好?

假设子查询正在检索一行,您可以使用MAX或MIN聚合函数以及CASE表达式以这种方式消除子查询:

SELECT 
    SUM(`attr`) AS `attrsum`, 
    MAX( CASE WHEN `specialcondition`=YYY THEN `attr` END ) as `attr` 
FROM `table` WHERE `id`=XXX
速度增益将取决于单个ID的表中记录的数量,如果只有几百条记录,它将是不可见的,因为在
(ID,specialcondition)
上没有多列索引的数百万条记录可能是重要的。

对于上面的查询,在
id
列上建立一个简单的索引就足够了。

假设子查询正在检索一行,您可以使用MAX或MIN聚合函数以及CASE表达式以这种方式消除子查询:

SELECT 
    SUM(`attr`) AS `attrsum`, 
    MAX( CASE WHEN `specialcondition`=YYY THEN `attr` END ) as `attr` 
FROM `table` WHERE `id`=XXX
速度增益将取决于单个ID的表中记录的数量,如果只有几百条记录,它将是不可见的,因为在
(ID,specialcondition)
上没有多列索引的数百万条记录可能是重要的。

对于上面的查询,在
id
列上建立一个简单的索引就足够了。

什么MySQL版本?我目前使用的是旧的5.0.96。这又有什么关系呢?MySQL 8支持窗口功能。我已经落后于此了——只是一个在旧的私有服务器上工作的autodidact。问题是,我有一种感觉,我在重复我自己的问题。但是如果您建议v8可以做得更好,那么在我的v5上应该可以?您可以检查执行计划以了解实际发生的情况,但从我所看到的情况来看,它至少需要两次完整的表扫描。什么MySQL版本?我目前使用的是旧的5.0.96。这又有什么关系呢?MySQL 8支持窗口功能。我已经落后于此了——只是一个在旧的私有服务器上工作的autodidact。问题是,我有一种感觉,我在重复我自己的问题。但是如果你建议v8可以做得更好,那么在我的v5上就可以了?你可以检查执行计划,看看实际发生了什么,但从我所看到的情况来看,它至少需要两次完整的表扫描。简单而聪明,似乎正是我所说的,存在的,但我自己无法理解:)THX!简单和聪明,似乎正是我所吹捧的东西,存在,但我自己无法理解:)THX!