大于和小于MySql查询失败的十进制字段

时间:2013-04-04 23:25:09

标签: mysql

我有一个包含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 ;

3 个答案:

答案 0 :(得分:6)

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

AND `lat` > '-1.300000' 
AND `lon` BETWEEN '55.555555' AND '53.000000' -- use between here

答案 1 :(得分: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';

答案 2 :(得分:0)

示例 从STATION查询具有大于和小于的值的北纬度之和(LAT_N)。截断小数位的答案。

从LAT_N&gt; 38.7880和LAT_N&lt; 137.2345;

的站点中选择ROUND(sum(LAT_N),4)