मुझे क्या चाहिए:

अलग-अलग निर्देशांक चुनने के लिए मुझे क्वेरी के अंदर किसी प्रकार का IF स्टेटमेंट लिखना होगा, if table1.business_id, 1 के बराबर है।

उदाहरण के लिए:

table1 में से lng और lat फ़ील्ड चुनें if table1.business_id = 1, अन्यथा, lng और lat फ़ील्ड चुनें table2

प्रश्न:

SELECT *, 
(3959 * acos(
   cos(radians('.$cords['result']['latitude'].')) * 
   cos(radians(lat)) * cos( radians(lng) - 
   radians('.$cords['result']['longitude'].')) + 
   sin(radians('.$cords['result']['latitude'].')) * 
   sin(radians(lat))
)) AS distance 
   FROM table1 INNER JOIN table2 ON table2.id = table1.business_id 
   WHERE type <> "industry" AND '.$query.'
   HAVING distance < '.$radius.'
   ORDER BY distance LIMIT 100

मैं यह कैसे काम कर सकता हूँ? तकनीकी रूप से सही क्वेरी कैसे लिखें?

किसी भी उत्तर के लिए धन्यवाद।

0
Tauras 14 नवम्बर 2017, 14:53

3 जवाब

सबसे बढ़िया उत्तर

आप CASE कथन का उपयोग कर सकते हैं, या प्रवाह को नियंत्रित करने के लिए IF कथन . विचार यह निर्धारित करना है कि किस तालिका से डेटा का उपयोग किया जाए:

IF(`table1`.`business_id` = 1, `table1`.`lat`, `table2`.`lat`) 

lat के सभी मौजूदा उपयोगों के स्थान पर रखा जाएगा (और long के लिए भी यही)

SELECT *, 
(3959 * acos(
   cos(radians('.$cords['result']['latitude'].')) * 
   cos(radians(IF(`table1`.`business_id` = 1, `table1`.`lat`, `table2`.`lat`))) * 
   cos( radians(IF(`table1`.`business_id` = 1, `table1`.`lng`, `table2`.`lng`)) - 
   radians('.$cords['result']['longitude'].')) + 
   sin(radians('.$cords['result']['latitude'].')) * 
   sin(radians(IF(`table1`.`business_id` = 1, `table1`.`lat`, `table2`.`lat`)))
)) AS distance 
   FROM table1 INNER JOIN table2 ON table2.id = table1.business_id 
   WHERE type <> "industry" AND '.$query.'
   HAVING distance < '.$radius.'
   ORDER BY distance LIMIT 100

असंबंधित, ऐसा लगता है कि आप अपनी क्वेरी में मानों को जोड़ रहे हैं। बहुत सावधान रहें कि आप स्वयं को SQL इंजेक्शन हमलों के लिए नहीं खोल रहे हैं!

1
kchason 14 नवम्बर 2017, 15:03

मुझे लगता है कि कई रूपांतरणों के साथ गणना, क्योंकि और पाप बल्कि भारी है।

मेरा सुझाव है कि पहले एक आयत पर चयन करें

where abs(latitude1-latitude2)<latdif
and abs(longitude1-longitude2)<longdif

फिर इसे अस्थायी तालिका, दृश्य या सबक्वायरी में उपयोग करें।

यह कारण का प्रश्न का पूर्ण उत्तर नहीं है।

0
Leif Neland 14 नवम्बर 2017, 15:05

'आप केस का उपयोग तब कर सकते हैं जब

select a, b,
case 
  when table1.business_id = 1 
  then 'Pick lng and lat fields from table1'
  else 'pick lng and lat fields from table2' 
end col1, clo2
from table1, table 2 where table1.id = table2.id
0
aljassi 14 नवम्बर 2017, 15:06