mysql在一个查询中使用两个函数

u4vypkhs  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(241)

我尝试在一个查询中使用两个相同的函数,这就是

select *,  ST_Distance_Sphere( point(
                31.00000, 35.00000),
                point(latitude_0, longitude_0)) * .0001
                as `distance_in_km` ,

          ST_Distance_Sphere( point (
                31.00000, 35.00000),
                point(dest_latitude_0, dest_longitude_0)) * .0001
                as `distance_in_km`

               from `most_places_used` 
                having `distance_in_km` <= '0.001' 
order by `distance_in_km` asc Limit 1

这只使用第一个函数,只为第一个latlngs提供正确的结果。
我需要一行,它几乎接近2个latlngs(latlngs只是一个例子,不在乎它是否错<3),我想让它给我一行,等于函数,假设是函数latlngs接近4列latlngs
这是列名。。在函数st\u distance\u sphere中

(latitude_0, longitude_0, dest_latitude_0, dest_longitude_0)

我需要类似于这个查询的东西做同样的需要或修复它<3

q9rjltbz

q9rjltbz1#

您为两个不同的列提供了相同的别名,这使得您的查询对于要使用哪个列进行过滤和排序不明确。我推荐两个不同的别名和 least() 取而代之的是:

select *
from (
    select 
        mpu.*,  
        ST_Distance_Sphere( 
            point(31.00000, 35.00000),
            point(latitude_0, longitude_0)
        ) * 0.0001 as distance_in_km1,
        ST_Distance_Sphere( 
            point (31.00000, 35.00000),
            point(dest_latitude_0, dest_longitude_0)
        ) * 0.0001 as distance_in_km2
    from most_places_used mpu
) t
where least (distance_in_km1, distance_in_km2) <= 0.001
order by least (distance_in_km1, distance_in_km2)
limit 1

注意,我使用了子查询而不是 having 条款:这是一个更标准和可读性的方式进行,没有任何性能罚款无论如何。
如果不需要区分结果集中的两个计算,可以移动 least() 直接到子查询:

select *
from (
    select 
        mpu.*,  
        least(
            ST_Distance_Sphere( 
                point(31.00000, 35.00000),
                point(latitude_0, longitude_0)
            ),
            ST_Distance_Sphere( 
                point (31.00000, 35.00000),
                point(dest_latitude_0, dest_longitude_0)
            )
        ) * 0.0001 as distance_in_km
    from most_places_used mpu
) t
where distance_in_km <= 0.001
order by distance_in_km
limit 1

相关问题