1.需求:根据实时位置计算直线距离排序获取数据
2.sql:
SELECT
`hospital`.*
round((((asin(sqrt((power(sin(((((pi() * 当前纬度) / 180) - ((pi() * `hospital`.`latitude`) / 180)) / 2)), 2) + (cos(((pi() * 当前纬度) / 180)) * cos(((pi() * `hospital`.`latitude`) / 180)) * power(sin(((((pi() * 当前经度) / 180) - ((pi() * `hospital`.`longitude`) / 180)) / 2)), 2))))) * 1000) * 2) * 6378.138)) AS `distant`
FROM `hospital`
WHERE `hospital`.`active` = 1
HAVING `distant` <= 500
ORDER BY
`distant` ASC,
id DESC
注:HAVING条件是圆形半径500米范围内,WHERE 关键字无法与聚合函数一起使用,HAVING 子句主要和 GROUP BY 子句配合使用
3.JOOQ写法:
/**
* 计算坐标距离
*
* @param curLatitude 当前纬度
* @param curLongitude 当前经度
* @param latitude 数据库字段 经度
* @param longitude 数据库字段 纬度
*/
private Field<BigDecimal> calculateDistant(BigDecimal curLatitude, BigDecimal curLongitude,
Field<BigDecimal> latitude,
Field<BigDecimal> longitude) {
return DSL.round(DSL.asin(DSL.sqrt(DSL.power(DSL.sin((DSL.pi()
.multiply(curLatitude)
.divide(180)
.subtract(DSL.pi()
.multiply(latitude)
.divide(180))).divide(2)), 2)
.add(DSL.cos(DSL.pi()
.multiply(curLatitude)
.divide(180))
.multiply(DSL.cos(DSL.pi()
.multiply(latitude)
.divide(180)))
.multiply(DSL.power(DSL.sin((DSL.pi()
.multiply(curLongitude)
.divide(180)
.subtract(DSL.pi()
.multiply(longitude)
.divide(180))
.divide(2))), 2)))))
.multiply(1000)
.multiply(2)
.multiply(6378.138));
}