4

我有一个包含 3 列的数据库:

user_id | lat      | lon
1       |-1.403976 | 53.428692
2       |-1.353276 | 55.224692
etc etc       

lat 和 lon 都设置为十进制字段。我正在运行与此类似的查询,但它不是基于大于和小于给定的纬度/经度数字进行过滤:

SELECT * FROM `table` WHERE `lat` < '-1.399999' AND 'lat' > '-1.300000' 
AND 'lon' < '55.555555' AND > '53.000000'

这个查询只返回表中的每一行,我不知道为什么?这与设置为小数的字段有关吗?

我希望有人可以提供帮助-如果您知道,我知道这可能是一个简单的答案。

根据评论 - 这是创建表:

CREATE TABLE IF NOT EXISTS `members` (
`user_id` int(10) NOT NULL AUTO_INCREMENT,
`lat` decimal(8,6) NOT NULL,
`lon` decimal(8,6) NOT NULL,
UNIQUE KEY `user_id` (`user_id`),
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=136 ;
4

3 回答 3

6

问题是你用单引号包裹列名,强制十进制值与字符串文字进行比较。列名和表名是标识符而不是字符串文字,因此它们不应该用单引号引起来。

AND `lat` > '-1.300000' 
AND `lon` BETWEEN '55.555555' AND '53.000000' -- use between here
于 2013-04-04T23:27:35.667 回答
0

正如@JW 建议的那样,您将反引号 ( `) 和单引号 ( ') 混合在一起。在数据库表和列名周围使用反引号,但在数据值周围使用引号。

此外,查询的后半部分与前半部分不匹配。你有

`lat` < '-1.399999' AND 'lat' > '-1.300000'
'lon' < '55.555555' AND > '53.000000'

但应该是

`lat` < '-1.399999' AND `lat` > '-1.300000'
`lon` < '55.555555' AND `lon` > '53.000000'

因此,您在第四条语句中缺少列名。

或者,正如@JW 所说,使用BETWEEN它也更容易阅读!

SELECT * FROM `table` WHERE `lat` BETWEEN '-1.399999' AND '-1.300000' AND `lon` BETWEEN '55.555555' AND '53.000000';
于 2013-04-04T23:40:37.277 回答
0

例子:

从 STATION 查询值大于 38.7880 且小于 137.2345 的北纬 (LAT_N) 总和。将您的答案截断到小数点后 4 位。

SELECT TRUNCATE(SUM(LAT_N),4)
FROM STATION
WHERE LAT_N > 38.7880 and LAT_N < 137.2345;
于 2017-03-31T07:12:47.980 回答