MYSQL在WHERE子句中使用别名

MYSQL在WHERE子句中使用别名,mysql,Mysql,我已经读到,您不能在WHERE子句中使用别名,但我仍然没有一个好的替代解决方案来实现我下面要做的事情。我如何处理距离计算,使其在WHERE子句中可用 SELECT n.nid AS nid, location.name AS location_name, (6371.0 * ACOS(SIN((location.latitude * RADIANS(1))) * SIN((28.755925 * RADIANS(1))) + COS((location.latitude * RADIANS(1)

我已经读到,您不能在WHERE子句中使用别名,但我仍然没有一个好的替代解决方案来实现我下面要做的事情。我如何处理距离计算,使其在WHERE子句中可用

SELECT n.nid AS nid, location.name AS location_name, (6371.0 * ACOS(SIN((location.latitude * RADIANS(1))) * SIN((28.755925 * RADIANS(1))) + COS((location.latitude * RADIANS(1))) * COS((28.755925 * RADIANS(1))) * COS((location.longitude * RADIANS(1)) - (-81.346395 * RADIANS(1))))) AS distance
            FROM 
            node n
            LEFT JOIN location_instance ON n.vid = location_instance.vid
            LEFT JOIN location ON location_instance.lid = location.lid
            WHERE (( (n.status = '1') AND (n.type IN  ('locations')) AND (distance <= 100) ))
            ORDER BY distance
            LIMIT 10

MySQL扩展了HAVING子句的使用,HAVING子句可用于此目的。如果查询不是聚合查询,那么have仍然进行过滤,但它允许使用别名

所以,你可以写:

SELECT n.nid AS nid, l.name AS l, (6371.0 * ACOS(SIN((l.latitude * RADIANS(1))) * SIN((28.755925 * RADIANS(1))) + COS((l.latitude * RADIANS(1))) * COS((28.755925 * RADIANS(1))) * COS((l.longitude * RADIANS(1)) - (-81.346395 * RADIANS(1))))) AS distance
FROM node n LEFT JOIn
     location_instance li
     ON n.vid = li.vid LEFT JOIN
     location l
     ON li.lid = l.lid
WHERE n.status = 1 AND n.type IN ('locations') 
HAVING distance <= 100
ORDER BY distance
LIMIT 10;
注:

如果status是一个数字,看起来很可能,那么您应该将其与数字进行比较,而不是与字符串进行比较。 表别名使查询更易于编写和读取。 虽然状态和类型可以放在HAVING子句中,但我怀疑它们在HAVING中更好,因为我怀疑HAVING可能会影响优化选择。 您可以使用子查询,但这将存储表中的所有数据。
你必须重复一遍。哇,谢谢。我不认为HAVING可以处理这个计算。@mrtonyb-HAVING不在哪里。其中减少行数并筛选结果集。因此,where更快,可以使用indexI,而不必太担心优化选择。我最初想提一下,但这样的担心让我推迟了;现在我有更多的时间来考虑,用一个复杂的条件计算,例如,我怀疑在WHERE子句中任何优化都是可能的…如果MySQL不这么早关注它,它可能会更快。