我有一个包含lon
和lat
地理位置数据的数据库。
两者都保存为 mysql 中的 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.")
但它没有显示任何结果(它应该!) - 但也没有错误。
如何轻松解决这个问题(我实际上不想使用空间索引 - 至少我不明白该怎么做)?
谢谢。
最佳答案
我建议您在进行变量替换后验证该语句的外观。
也就是说,在准备/执行 SQL 语句之前,echo
或 vardump
包含 SQL 文本的变量的内容。
谓词的形式似乎没有任何问题。 (这些可以使用等效的 BETWEEN 比较器来编写,但这不是您编写的问题。)
您可能交换了 min
和 max
值,或者交换了经度和纬度。如果这不是问题,那么我怀疑被替换的变量可能以科学计数法表示,而不是十进制值。
例如生成 SQL 文本
... u.lat <= 1.241E+2 ...
而不是
... u.lat <= 124.1 ...
在前一种情况下,MySQL 会将该文字计算为十进制值 1.241。
(当边界框跨越 +180/-180 边界时,会出现一个极端情况问题,但我不认为这对于您的大多数值来说可能是一个问题,这将是一个异常(exception)情况,您可能会这样做需要设置特殊的测试用例才能真正发生。)
为了调试此问题,您需要准备/执行发送到数据库的实际 SQL 文本。
(您的问题中没有足够的信息来确定实际问题。)
<小时/>问:如何获取实际的 SQL 文本?
A:将 SQL 语句构建为字符串到变量中;然后var_dump
该变量进行调试:
$sqltext = "SELECT ... WHERE u.lat <= ". $lat_max . " AND u.lat ... ";
var_dump($sqltext);
$stmt = mysqli_prepare($db, $sqltext);
关于php - 如何与 MySQL 比较(最小和最大)浮点值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18669286/