2016-04-11 25 views
1

DISTANCE_BETWEEN bir işlev tarafından belirlenen bir "dinamik" değerden minimum almak istiyorum.MySQL, işlevden en az

SELECT d.id 
FROM (SELECT id , DISTANCE_BETWEEN (Latitude,Longitude,43.2560997009,-2.9078400135) AS distance FROM Locations) AS D 
WHERE MIN(d.distance); 

doğru

Invalid use of group function 

cevap

1

İşte sadece order by maddesi işlevi taşımak olduğunu order by

SELECT D.id 
FROM (SELECT id , DISTANCE_BETWEEN (Latitude,Longitude,43.2560997009,-2.9078400135) AS distance FROM Locations) AS D 
ORDER BY distance 
LIMIT 1 
+0

Her iki yanıt da işe yarıyor, ancak bu daha basit görünüyor. Teşekkürler. –

2
SELECT id 
FROM Locations 
WHERE DISTANCE_BETWEEN (Latitude,Longitude,43.2560997009,-2.9078400135) = 
    (SELECT MIN(DISTANCE_BETWEEN (Latitude,Longitude,43.2560997009,-2.9078400135)) FROM Locations) 
1

Bir yöntem kullanılarak başka bir yol alınamıyor:

SELECT D.id 
FROM locations 
ORDER BY DISTANCE_BETWEEN(Latitude, Longitude, 43.2560997009, -2.9078400135) 
LIMIT 1; 

Bu, mantığı ifade etmenin en basit yöntemidir (bazı durumlarda, en verimli olmayabilir).

+0

Neden verimli olmuyor? –

+0

@ElDude. . . Bu, belirli bir satır için mesafeyi çok kez hesaplayabilir. Alt sorgu materyalleştirilirse, mesafe yalnızca bir kez hesaplanır. –