आपको बस सेल्फ-जॉइन करने की जरूरत है। शामिल होना टेबल एक बहुत है SQL का मूलभूत हिस्सा—आप वास्तव में इस उत्तर को और समझने की कोशिश करने से पहले इसे पढ़ना चाहिए।
SELECT poi.asciiname,
suburb.asciiname,
suburb.country,
DEGREES(
ACOS(
SIN(RADIANS( poi.latitude))
* SIN(RADIANS(suburb.latitude))
+ COS(RADIANS( poi.latitude))
* COS(RADIANS(suburb.latitude))
* COS(RADIANS(poi.longitude - suburb.longitude))
)
) * 60 * 1.852 AS distance
FROM geoname AS poi
JOIN geoname AS suburb
WHERE poi.asciiname IN ('Tamworth', 'Birmingham', 'Roanoke')
AND poi.population > 0
AND poi.fcode = 'PPL'
AND suburb.fcode IN ('PPLX', 'PPPL')
HAVING distance <= 60
ORDER BY poi.asciiname, distance
इसे sqlfiddle पर देखें ।
आपने देखा होगा कि मैंने MySQL के IN()
value = A OR value = B OR ...
. के लिए शॉर्टहैंड के रूप में ऑपरेटर ।
आपने यह भी देखा होगा कि मैंने MySQL के DEGREES()
और RADIANS()
ऐसे रूपांतरणों को स्पष्ट रूप से करने की कोशिश करने के बजाय कार्य करता है।
तब आप अक्षांश के मिनटों को 1.851999999962112
. के गुणनखंड से गुणा कर रहे थे , जो काफी अजीब था:यह 1.852
. के बेहद करीब है , जो एक समुद्री मील में किलोमीटर की सटीक संख्या है (ऐतिहासिक रूप से अक्षांश के एक मिनट के रूप में परिभाषित), लेकिन फिर भी विचित्र रूप से थोड़ा अलग-मैंने माना है कि आप इसके बजाय इसका उपयोग करना चाहते थे।
अंत में, आपके पास शाब्दिक मूल्य था जिसके द्वारा आप परिणाम में दूरियों को एक स्ट्रिंग के रूप में फ़िल्टर कर रहे थे, अर्थात '60'
, जबकि स्पष्ट रूप से यह एक संख्यात्मक मान है और इसे गैर-उद्धृत किया जाना चाहिए।