我的mySQL请求看起来像这样:
SELECT
COUNT(*) AS cnt,
(3595 *
acos(
cos(radians({$lat1}))
* cos(radians(lattitude))
* cos(radians(longitude) - radians({$lon1}))
+ sin(radians({$lat1}))
* sin(radians(lattitude))
)
) AS distance,
status
FROM
members
WHERE
status in ('married', 'single', 'divorced')
GROUP BY
status
HAVING
distance < 50
这是由我的AJAX请求调用的,这样做是这样的,例如:
success: function(data){
$("#count_marriedpeople").html(data[0].cnt);}
此代码存在一些问题。值{$lat1}
和{$lon1}
对应于输入值。这个想法是计算距离给定的经纬度坐标50英里范围内的所有人。
我现在遇到的问题是,如果结果与条件中的所有内容都不匹配,我会收到无法匹配的错误,并且我的所有请求都会失败。
我尝试过执行SELECT IF ISNULL
,但问题(据我的理解)是代码提供空结果,而不是null
。因此,IFNULL
后备不起作用。
我如何修复此代码,以便married
,single
或divorced
没有任何值,那么它们只返回0,而不会破坏我的查询?
答案 0 :(得分:1)
一个大问题......查询没有“统计50英里内的人数”。 distance
表达式返回的值是针对组中的单个行。 HAVING
子句中的条件正在应用于该值。
要回答您提出的问题......您需要一个 rowsource ,它提供了在没有匹配的行时返回的状态。
作为返回指定结果的方法的示例,如下所示:
SELECT s.status
, COUNT(m.status) AS cnt
FROM ( SELECT _latin1'married' AS status
UNION ALL SELECT _latin1'single'
UNION ALL SELECT _latin1'divorced'
) s
LEFT
JOIN members m
ON m.status = s.status
AND (3595 *
ACOS(
COS(RADIANS({ $lat1 }))
* COS(RADIANS(m.lattitude))
* cos(radians(m.longitude) - RADIANS({ $lon1 }))
+ SIN(RADIANS({ $lat1 }))
* SIN(RADIANS(m.lattitude))
)
) < 50
GROUP BY s.status
内联视图s
返回三行,即我们想要返回的三个状态值。
外部联接到members
会返回任何“匹配”行。条件位于外连接的ON
子句中,而不是WHERE子句。
GROUP BY折叠行,并获得COUNT聚合。
这只是一种可能模式的例子。
还有其他查询模式会返回相同的结果。