有没有办法优化此代码以更快地运行并且不执行两次相同的操作? (我确实在users.lat和users.lng上设置了索引)
SELECT COUNT(*) AS count FROM users WHERE users.activated = '1' AND users.id != '1'
AND ROUND((DEGREES(ACOS(SIN(RADIANS('$c_lat')) * SIN(RADIANS(users.lat)) + COS(RADIANS('$c_lat')) * COS(RADIANS(users.lat)) * COS(RADIANS('$c_lng' - users.lng))))) * 60 * 1.1515 * 1.60934 * 1000) >= 1000
AND ROUND((DEGREES(ACOS(SIN(RADIANS('$c_lat')) * SIN(RADIANS(users.lat)) + COS(RADIANS('$c_lat')) * COS(RADIANS(users.lat)) * COS(RADIANS('$c_lng' - users.lng))))) * 60 * 1.1515 * 1.60934 * 1000) <= 5000
此代码获取距离$ c_lat 1000米到5000米之间的所有用户的计数以及我在PHP中传递的$ c_lng。
另外,我想避免使用HAVING子句。
谢谢!
答案 0 :(得分:1)
您可以使用存储过程来保存这些中间值,并避免计算罪和acos两次。
您可以进行一次计算,将值存储在临时变量中并使用它们进行查询。