mysql计算数据与当前坐标的距离并排序

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));
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>