如何比较(最小和最大)Float值与MySQL?

时间:2013-09-07 03:09:48

标签: php mysql geolocation comparison

我的数据库包含lonlat 地理位置数据。 两者都保存为表中的float / decimal属性。

现在我想比较这些东西:

(u.user_location_lat <= ".$lat_max." AND u.user_location_lat >= ".$lat_min.") AND
(u.user_location_long <= ".$long_max." AND u.user_location_long >=".$long_min.")

但它没有显示任何结果(它应该!) - 但也没有错误。

如何轻松解决此问题(我实际上不想使用spatial索引 - 至少我不明白该怎么做?)

感谢。

1 个答案:

答案 0 :(得分:0)

我建议您在进行变量替换后验证该语句是什么样的。

即,在准备/执行SQL语句之前,echovardump包含SQL文本的变量的内容。

谓词的形式似乎没有任何问题。 (这些可以使用等效的BETWEEN比较器编写,但是你写的不是问题。)

您可能会交换minmax值,或者交换经度和纬度。如果那不是问题,那么我怀疑被替换的变量可能用科学记数法表示,而不是十进制值。

e.g。生成SQL文本

  ...  u.lat <= 1.241E+2 ...

而不是

  ...  u.lat <= 124.1 ... 

在前一种情况下,MySQL会将该文字计算为十进制值1.241。

(当边界框越过+ 180 / -180边界时有一个角点问题,但我不认为你的大多数值可能存在问题,这可能是一个例外情况,你可能会需要设置特殊测试用例才能实现。)

为了调试它,您需要准备/执行发送到数据库的实际SQL文本。

(问题中没有足够的信息来确定实际问题。)


问:如何获取实际的SQL文本?

A:将SQL语句构造为变量的字符串;然后var_dump该变量用于调试:

$sqltext = "SELECT ... WHERE u.lat <= ". $lat_max . " AND u.lat ... ";
var_dump($sqltext);
$stmt = mysqli_prepare($db, $sqltext);