MySQL为空响应返回0

时间:2016-12-25 02:09:37

标签: mysql

我的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后备不起作用。

我如何修复此代码,以便marriedsingledivorced没有任何值,那么它们只返回0,而不会破坏我的查询?

1 个答案:

答案 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聚合。

这只是一种可能模式的例子。

还有其他查询模式会返回相同的结果。