使用复杂的 HAVING 语句统计 MySQL 中的记录

Counting records in MySQL with a complicated HAVING Statement

我有一个查询 returns 在给定位置 (lat/lng) 的半径(以英里为单位)内绘制标记。我的查询在读取数据时有效,但我想设置分页,所以需要先计算记录以确定我将拥有多少页数据。

我的查询是:

SET @LAT := 53.068464;
SET @LNG := -4.076113;
SET @Miles := 10;


SELECT (3959 * acos( cos( radians(@LAT) ) * cos( radians( M.Lat ) ) * cos( 
radians( M.Lng ) - radians(@LNG) ) + sin( radians(@LAT) ) * sin( radians( 
M.Lat ) ) ) ) AS distance, M.MarkerId, M.Title 
FROM Markers AS M 
HAVING distance < @Miles
ORDER BY M.DateStamp desc, Distance 

我试过了

SELECT COUNT(MarkerId) 
FROM Markers
HAVING (3959 * acos( cos( radians(@LAT) ) * cos( radians( Lat ) ) * cos( 
radians( Lng ) - radians(@LNG) ) + sin( radians(@LAT) ) * sin( radians( Lat ) 
) ) ) < @Miles

但它无法尝试从标记 table 引用 Lat 和 Lng 字段。

有两种方法。一种是使用子查询:

SELECT COUNT(*)
FROM (SELECT (3959 * acos( cos( radians(@LAT) ) * cos( radians( M.Lat ) ) * cos( 
    radians( M.Lng ) - radians(@LNG) ) + sin( radians(@LAT) ) * sin( radians( 
    M.Lat ) ) ) ) AS distance, M.MarkerId, M.Title 
      FROM Markers AS M 
      HAVING distance < @Miles
    ) x

第二种方法是使用SQL_CALC_FOUND_ROWS然后FOUND_ROWS()函数:

SELECT SQL_CALC_FOUND_ROWS (3959 * acos( cos( radians(@LAT) ) * cos( radians( M.Lat ) ) * cos( 
radians( M.Lng ) - radians(@LNG) ) + sin( radians(@LAT) ) * sin( radians( 
M.Lat ) ) ) ) AS distance, M.MarkerId, M.Title 
FROM Markers AS M 
HAVING distance < @Miles
ORDER BY M.DateStamp desc, Distance ;

SELECT FOUND_ROWS();
$str1="select SQL_CALC_FOUND_ROWS (3959 * acos( cos( radians(@LAT) ) * cos( radians( M.Lat ) ) * cos( 
radians( M.Lng ) - radians(@LNG) ) + sin( radians(@LAT) ) * sin( radians( 
M.Lat ) ) ) ) AS distance, M.MarkerId, M.Title 
FROM Markers AS M 
HAVING distance < @Miles
ORDER BY M.DateStamp desc, Distance limit ".$offset.",".$limit;
$q1 = mysql_query($str1);
$result=array();
$str2="SELECT FOUND_ROWS() AS Count";
$q2 = mysql_query($str2);
while($objCount= $q2->fetch_assoc()) {
        $result["TotalRows"] = $objCount['Count'];
 }
if ($q1->num_rows > 0) {       
            $result["Rows"] = mysql_result($q1);
} else {
            $result["Rows"] = array();
}       
return $result;