Vấn đề là bạn không thể tham chiếu cột bí danh (distance
trong trường hợp này) trong select
hoặc where
mệnh đề. Ví dụ:bạn không thể làm điều này:
select a, b, a + b as NewCol, NewCol + 1 as AnotherCol from table
where NewCol = 2
Điều này sẽ không thành công trong cả hai:select
khi cố gắng xử lý NewCol + 1
và cả trong where
khi cố gắng xử lý NewCol = 2
.
Có hai cách để giải quyết vấn đề này:
1) Thay thế tham chiếu bằng chính giá trị được tính toán. Ví dụ:
select a, b, a + b as NewCol, a + b + 1 as AnotherCol from table
where a + b = 2
2) Sử dụng select
bên ngoài tuyên bố:
select a, b, NewCol, NewCol + 1 as AnotherCol from (
select a, b, a + b as NewCol from table
) as S
where NewCol = 2
Bây giờ, với cột được tính toán KHỔNG LỒ và không thân thiện với con người của bạn :) Tôi nghĩ bạn nên chọn tùy chọn cuối cùng để cải thiện khả năng đọc:
SET @orig_lat=55.4058;
SET @orig_lon=13.7907;
SET @dist=10;
SELECT * FROM (
SELECT
*,
3956 * 2 * ASIN(SQRT(POWER(SIN((@orig_lat -abs(latitude)) * pi()/180 / 2), 2)
+ COS(@orig_lat * pi()/180 ) * COS(abs(latitude) * pi()/180)
* POWER(SIN((@orig_lon - longitude) * pi()/180 / 2), 2) )) as distance
FROM geo_kulplex.sweden_bobo
) AS S
WHERE distance < @dist
ORDER BY distance limit 10;
Chỉnh sửa: Như @Kaii đã đề cập bên dưới, điều này sẽ dẫn đến việc quét toàn bộ bảng. Tùy thuộc vào lượng dữ liệu bạn sẽ xử lý, bạn có thể muốn tránh điều đó và chuyển sang tùy chọn đầu tiên, tùy chọn này sẽ hoạt động nhanh hơn.