我正在使用MySQL。假设我有一个表test(id, x)
- 数据类型不重要 - 以及以下查询
SELECT id
FROM test
WHERE F(x) <= 1000;
此外,我们假设F
是一个“或多或少复杂”的功能。现在,如果我将查询更改为:
SELECT id, F(x)
FROM test
WHERE F(x) <= 1000;
也就是说,我需要F(x)的结果不仅是WHERE条件,还需要SELECT子句中的输出。我可以安全地假设MySQL足够聪明,每行只计算一次吗?
(如果需要信息,在我的具体情况下,我使用MySQL空间函数ST_WITHIN,ST_GEOMFROMTEXT等处理地理坐标。)
答案 0 :(得分:3)
我认为使用派生表是一个很好的解决方案:
SELECT t1.id, t1.res
FROM (
SELECT id, F(x) as res
FROM test
) AS t1
WHERE t1.res <= 1000;
答案 1 :(得分:2)
聚合不能在WHERE中使用,而是在HAVING中使用。您需要添加GROUP BY子句。
SELECT id, F(x) as fx
FROM test
HAVING fx <= 1000;
如果条件引用聚合函数,请将该条件放在HAVING子句中。否则,请使用WHERE子句。
您可以使用HAVING,但建议您使用GROUP BY。
SQL Standard说WHERE在返回行之前限制结果集,HAVING在带来所有行之后限制结果集。所以WHERE更快。