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

时间:2019-01-05 13:11:03

标签: 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

它绝对可以运行并且可以执行我想要的操作,但是我不确定-这是执行此操作的最佳方法吗?我的意思是子查询仍然像另一个查询,因此我怀疑这是获取这些数据的优化方法。另一方面-我不知道如何做得更好。还是这是最好的方法,一切都可以在我的查询中找到?

1 个答案:

答案 0 :(得分:3)

假设子查询正在检索单个行,则可以使用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列上添加一个简单索引即可。