Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Sử dụng mệnh đề WHERE để tìm POI trong phạm vi khoảng cách từ Kinh độ và Vĩ độ

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sự khác biệt giữa utf8_general_ci và utf8_unicode_ci là gì?

  2. truy vấn mysql để cập nhật trường thành max (trường) + 1

  3. Cách thiết lập múi giờ xampp mysql và apache?

  4. truy vấn kinh độ và vĩ độ mySQL cho các hàng khác trong bán kính x dặm

  5. Làm thế nào để nhận được ngày đầu tiên của mỗi tháng tương ứng trong mysql?