2013-04-04 29 views
3

失败我有一个有3列数据库减:大于和高于MySQL查询与十进制场

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

两个纬度和经度设置为十进制的字段。我运行一个类似的查询,但它不是滤波基于比给定的经/纬度数大于和小于:

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 ; 
+0

你可以发布'show create table YourTable'吗? – Barmar 2013-04-04 23:31:19

回答

6

问题是你用单引号迫使十进制值进行比较的字符串文字包装的列名。列名称以及表名称都是标识符而不是字符串文字,因此它们不应该用单引号包装。

AND `lat` > '-1.300000' 
AND `lon` BETWEEN '55.555555' AND '53.000000' -- use between here 
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'; 
+0

这当然是一种帮助 - 感谢你和JW--现场有什么东西被设置为可能导致问题的Decimal? – user2246804 2013-04-04 23:50:31

0

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

从LAT_N> 38.7880和LAT_N < 137.2345的站点中选择ROUND(sum(LAT_N),4)