使用复杂的 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;
我有一个查询 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;