我有这个查询
$query = sprintf("SELECT price,
address,
state,
thumbnail,
name,
provider,
category,
latitude,
longitude,
( 6371 * acos( cos( radians('%s') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( latitude ) ) ) ) AS distance
FROM records
WHERE category IN ("1,2,3")
AND active = '1'
HAVING distance < '%s'
ORDER BY distance",
mysql_real_escape_string($center_lat),
mysql_real_escape_string($center_lng),
mysql_real_escape_string($center_lat),
mysql_real_escape_string($radius));
它基本上从表格中获取坐标并计算这些点与用户输入坐标之间的距离($ center_lat,lng)。然后根据距离对其进行订购。
数据库中的某些记录没有经度和纬度,因此不会返回,并且没有坐标的记录的坐标为='0',其中坐标的坐标为坐标='1'
我的问题是,如果我还要返回没有坐标的记录,该怎么办?如果坐标='0',我该如何绕过距离计算过程。
答案 0 :(得分:2)
在“HAVING”部分添加另一个子句:
SELECT ...
HAVING ((distance < 1) or (coordinates = 0)) AND $price
...
答案 1 :(得分:0)
我可能错了,但我没有在你的查询中看到任何检查&#34;纬度是否为空的情况&#34;或者&#34;经度不是空的&#34;或&#34; coordinates =&#39; 1&#39;&#34;。这意味着您的查询应返回所有具有坐标或不具有坐标的记录。对于后者,当然SELECT输出在纬度&#39;经度&#39;中没有任何值。和#&#39;距离&#39;字段。
我认为您不需要绕过&#39; coordinates = 0&#39;的距离计算。因为无论如何都会返回NULL,但是如果你愿意,可以使用CASE函数来完成,如下所示:
SELECT price,
address,
state,
thumbnail,
name,
provider,
category,
latitude,
longitude,
(
CASE
WHEN coordinates = '1'
THEN ( 6371 *
acos(
cos( radians('%s') ) *
cos( radians( latitude ) ) *
cos( radians( longitude ) - radians('%s') ) +
sin( radians('%s') ) *
sin( radians( latitude ) )
) )
ELSE 0
) AS distance
FROM records
...
...