1

我有以下查询:

SELECT 
    `people`.`surename`, 
    calcWeight(`people`.`surname`,'kiera',6)
    as `weight`
FROM
    `people`
LEFT JOIN
    `dogs`
ON
    `people`.`id` = `dogs`.`owner` 
ORDER BY 
    `weight` DESC 

问题是我需要删除所有结果 where weight,这是我计算的值是 0。我认为它会 WHERE weight> 0 但显然weight直到 where 子句之后才存在。我不知道我是打算移动weight计算的位置还是移动 WHERE。

我不想做

 WHERE calcWeight(`people`.`surname`,'kiera',6) > 0

因为 calcWeight 需要很长时间来计算(当它发生在数千行上时)而且我不知道它是否会缓存结果并重新使用它。

任何帮助和建议都会很棒!谢谢 !

4

2 回答 2

3

使用子查询执行此操作的最佳方法:

select t.*
from (SELECT `people`.`surename`, calcWeight(`people`.`surname`,'kiera',6) as `weight`
      FROM `people` LEFT JOIN
           `dogs`
           ON  `people`.`id` = `dogs`.`owner` 
     ) t
where weight > 0
ORDER BY `weight` DESC 
于 2012-10-07T17:37:07.737 回答
2

在您的ORDER BY条款之前,添加HAVING weight > 0. HAVING子句可以引用您在SELECT子句中设置的聚合函数和别名。

WHERE和的区别HAVINGWHERE在结果集投影之前HAVING执行,在实际投影的结果集上执行。因此,WHERE有更多使用索引的机会(我认为HAVING过滤器根本不能使用索引),但HAVING更灵活一些。尽可能使用WHEREHAVING否则使用。

于 2012-10-07T17:31:07.527 回答