2012-04-02 33 views
8

Tôi đã tìm thấy nhiều bài đăng tương tự và thậm chí đã cố gắng tìm hiểu cách xử lý các giá trị âm trong MySQL, nhưng không có kết quả.MySQL - Tìm kiếm giá trị kinh độ âm với BETWEEN

Tôi có một trang web mà tôi đang sử dụng Google Maps và như một cải tiến hiệu suất tôi đang giới hạn các điểm đánh dấu được vẽ trên bản đồ cho những người nằm trong ranh giới bản đồ.

Tôi muốn phát triển truy vấn sẽ hoạt động với các giá trị dươngvà longitude.

Đối với cơ sở dữ liệu:

latitude FLOAT(10, 6) 
longitude FLOAT(10, 6) 

Truy vấn:

SELECT * 
FROM `table` 
WHERE `latitude` BETWEEN 47.926930 AND 47.929806 
AND `longitude` BETWEEN -97.077303 AND -97.083997 

Nếu tôi thả các khoản BETWEEN cho longitude tôi nhận được kết quả, mặc dù không chính xác với không longitude hạn chế.

Tôi đã thử này:

AND -`longitude` BETWEEN ABS(-97.077303) AND ABS(-97.083997) 

nào không làm việc, nhưng chỉ cho longitude giá trị âm.

Tôi có cần kiểm tra longitude nếu âm tính của nó không?

+2

Khi sử dụng GIỮA bạn nên có giá trị thấp hơn trước và giá trị cao hơn thứ hai. -98.083997 thấp hơn -97.077303, do đó, hoán đổi thứ tự của hai trong mệnh đề BETWEEN. – scwagner

+0

Ah vâng, một cái gì đó đơn giản và hiển nhiên như bình thường. Cảm ơn bạn! Đôi khi bạn chỉ cần một bộ mắt khác. Đây có phải là giải pháp có thể chấp nhận được không? 'SELECT * FROM tên_bảng ĐÂU vĩ GIỮA ÍT NHẤT (47,926930, 47,929806) và lớn (47,926930, 47,929806) VÀ longitude GIỮA ÍT NHẤT (-97,077303, -97,083997) và lớn (-97,077303, -97,083997) ' – hungerstar

Trả lời

10

Bạn cũng có thể sử dụng các chức năng greatest()least(), vì vậy bạn không cần phải lo lắng về các thông số. Ví dụ:

SELECT * FROM table 
WHERE latitude BETWEEN least(@lat1, @lat2) AND greatest(@lat1, @lat2) 
AND longitude BETWEEN least(@lon1, @lon2) AND greatest(@lon1, @lon2) 
+0

Tôi chỉ đã đưa ra giải pháp này! như đã đăng ở trên trong một vài câu trả lời và nhận xét. Cho tôi biết bạn nghĩ gì! Cảm ơn! – hungerstar

+0

Được chấp nhận vì điều này làm việc cho việc đặt hàng đúng đắn 'BETWEEN' yêu cầu giá trị thấp hơn trước giá trị cao hơn và xử lý các giá trị dương/âm mà vĩ độ và kinh độ có. – hungerstar

3

between dự kiến ​​định dạng là somefield BETWEEN lowervalue AND highervalue. Kinh độ âm của bạn có giá trị cao hơn/thấp hơn được chuyển. Nó phải là

AND longitude BETWEEN -97.083997 AND -97.077303 

âm 97,08 thực sự là thấp hơn so với tiêu cực 97,07

+0

Vâng, cảm ơn bạn. Điều này có hiệu quả không? 'SELECT * FROM tên_bảng ĐÂU vĩ GIỮA ÍT NHẤT (47,926930, 47,929806) và lớn (47,926930, 47,929806) VÀ longitude GIỮA ÍT NHẤT (-97,077303, -97,083997) và lớn (-97,077303, -97,083997) ' – hungerstar

+0

yeah, nên làm thủ đoạn độc đáo. 'ít nhất (-1, -2)' trả về '-2', và ngược lại (-1) cho lớn nhất(). –

2

Đừng kiểm tra như thế nào số âm xuất hiện trên một dòng số. :)

SELECT * 
FROM `table` 
WHERE `latitude` BETWEEN 47.926930 AND 47.929806 
    AND `longitude` BETWEEN -97.083997 AND -97.077303 
+0

Tôi thấy rằng giải pháp của bạn là của bình luận đầu tiên ở trên, nhưng không rõ ràng. Nếu bạn sẽ làm rõ một chút vì vậy nó là rõ ràng hơn rằng bạn trao đổi các giá trị kinh độ tôi sẽ đánh dấu là chấp nhận.Bạn nghĩ gì về truy vấn này để giải quyết vấn đề? 'SELECT * FROM tên_bảng ĐÂU vĩ GIỮA ÍT NHẤT (47,926930, 47,929806) và lớn (47,926930, 47,929806) VÀ longitude GIỮA ÍT NHẤT (-97,077303, -97,083997) và lớn (-97,077303, -97,083997) ' – hungerstar

Các vấn đề liên quan