2012-10-08 77 views
0

此查詢中使用的基本郵政編碼是90210的lat/lng,其平均agi(2008年)超過40萬美元。我不希望它在這個輸出顯示,因爲範圍之間100000和200000如何指定在此MySQL查詢中包含特定的郵政編碼?

SELECT 
    zip, city, state, avg_agi, 
    (3959 
     * acos( 
       cos(radians(34.088808)) 
      * cos(radians(lat)) 
      * cos(radians(lng) - radians(-118.40612)) 
      + sin(radians(34.088808)) 
      * sin(radians(lat)) 
     ) 
) AS distance 
FROM 
    zip_codes, avgagi 
where 
     zip=zipcode 
    and avg_agi BETWEEN 100000 and 200000 
HAVING 
    distance < 5 ORDER BY distance LIMIT 0 , 10000; 

+-------+----------------+-------+---------+------------------+ 
| zip | city   | state | avg_agi | distance   | 
+-------+----------------+-------+---------+------------------+ 
| 90069 | West Hollywood | CA | 121753 | 1.42816585190112 | 
| 90211 | Beverly Hills | CA | 164538 | 2.06804933097035 | 
| 90024 | Los Angeles | CA | 187134 | 2.47751318825072 | 
| 90025 | Los Angeles | CA | 130983 | 3.76591348160737 | 
| 91604 | Studio City | CA | 103328 | 3.8634176735557 | 
| 90064 | Los Angeles | CA | 130769 | 3.95933331921038 | 
| 90068 | Los Angeles | CA | 100370 | 4.52908379278674 | 
+-------+----------------+-------+---------+------------------+ 

高達但是,對於我的應用程序需要它在輸出中包含基本的郵政編碼。有人建議我在郵編=「90210」時使用帶OR的WHERE,但是我很難搞清楚如何完成這項工作。當我嘗試合併這個建議時,它會旋轉最長的時間,永遠不會回來。

如何修改上述MySQL查詢,使其包含90210的郵政編碼,而不管BETWEEN範圍如何。謝謝!

回答

2

可能更容易使用UNION聲明:

SELECT 
    zip, city, state, avg_agi, 0 AS distance 
FROM 
    zip_codes, avgagi 
where 
     zip=zipcode 
UNION 
SELECT 
    zip, city, state, avg_agi, 
    (3959 
     * acos( 
       cos(radians(34.088808)) 
      * cos(radians(lat)) 
      * cos(radians(lng) - radians(-118.40612)) 
      + sin(radians(34.088808)) 
      * sin(radians(lat)) 
     ) 
) AS distance 
FROM 
    zip_codes, avgagi 
where 
     zip=zipcode 
    and avg_agi BETWEEN 100000 and 200000 
HAVING 
    distance < 5 ORDER BY distance LIMIT 0 , 10000; 

否則試試這個:

SELECT 
     zip, city, state, avg_agi, 
     (3959 
      * acos( 
        cos(radians(34.088808)) 
       * cos(radians(lat)) 
       * cos(radians(lng) - radians(-118.40612)) 
       + sin(radians(34.088808)) 
       * sin(radians(lat)) 
      ) 
    ) AS distance 
    FROM 
     zip_codes, avgagi 
    where 
      zip=zipcode 
    AND(zip = 90210 
    OR avg_agi BETWEEN 100000 and 200000) 
    HAVING 
     distance < 5 ORDER BY distance LIMIT 0 , 10000; 
+0

謝謝,WebChemist! 「否則試試這個」工作!而且我也很快,「8排(0.03秒)」。我曾嘗試添加OR(zip = zipcode和zip =「90210」),然後運行它需要14.3秒才能執行。從你的例子中我可以看出爲什麼這可能會更好。當你的MySQL代碼中只有一個需要時,我將它轉換爲zip = zipcode兩次。好樣的! – Edward

+1

如果您使用JOIN .. ON語句,則可以刪除括號,如FROM郵政編碼JOIN avg.agi ON zip = zipcode WHERE zip = 90210或avg_agi BETWEEN 100000 AND 200000 HAVING .... JOIN通常優先於做FROM中的多個表以及WHERE子句中的匹配foiegn /主鍵 – WebChemist