2017-04-14 57 views
0

我想將這個select語句調整到我的表中。此查詢從郵政編碼表中選擇位於給定郵政編碼的特定距離內的所有郵政編碼。但是,我有一張沙龍表,它將郵政編碼表作爲外部郵政編碼表存儲。我需要在給定的郵政編碼的特定距離內選擇所有的沙龍。如何在子查詢中執行內部連接? MySQL

DELIMITER // 
    CREATE PROCEDURE zip_search(lat_param FLOAT(9,6), 
    long_param FLOAT(9,6), dist_param INT(100) 
    ) 
    BEGIN 
    SELECT zipcode 
     FROM (
    SELECT z.zipcode, z.latitude, z.longitude, 
      p.radius, 
      p.distance_unit 
        * DEGREES(ACOS(COS(RADIANS(p.latpoint)) 
        * COS(RADIANS(z.latitude)) 
        * COS(RADIANS(p.longpoint - z.longitude)) 
        + SIN(RADIANS(p.latpoint)) 
        * SIN(RADIANS(z.latitude)))) AS distance 
     FROM accounts_zip AS z 
     JOIN ( /* these are the query parameters */ 
      SELECT lat_param AS latpoint, long_param AS longpoint, 
        dist_param AS radius,  69.0 AS distance_unit 
     ) AS p ON 1=1 
     WHERE z.latitude 
     BETWEEN p.latpoint - (p.radius/p.distance_unit) 
      AND p.latpoint + (p.radius/p.distance_unit) 
     AND z.longitude 
     BETWEEN p.longpoint - (p.radius/(p.distance_unit * COS(RADIANS(p.latpoint)))) 
      AND p.longpoint + (p.radius/(p.distance_unit * COS(RADIANS(p.latpoint)))) 
    ) AS d 
    WHERE distance <= radius 
    ORDER BY distance; 
    END // 

我嘗試從沙龍表中選擇後添加一個內部連接,但我不明白子查詢和連接非常好。任何想法將不勝感激。

DELIMITER // 
     CREATE PROCEDURE zip_search(lat_param FLOAT(9,6), 
     long_param FLOAT(9,6), dist_param INT(100) 
     ) 
     BEGIN 
     SELECT * 
      FROM (
     SELECT z.zipcode, z.latitude, z.longitude, 
       p.radius, 
       p.distance_unit 
         * DEGREES(ACOS(COS(RADIANS(p.latpoint)) 
         * COS(RADIANS(z.latitude)) 
         * COS(RADIANS(p.longpoint - z.longitude)) 
         + SIN(RADIANS(p.latpoint)) 
         * SIN(RADIANS(z.latitude)))) AS distance 
      FROM accounts_salon INNER JOIN accounts_zip ON accounts_salon.id=accounts_zip.id AS z 
      JOIN ( /* these are the query parameters */ 
       SELECT lat_param AS latpoint, long_param AS longpoint, 
         dist_param AS radius,  69.0 AS distance_unit 
      ) AS p ON 1=1 
      WHERE z.latitude 
      BETWEEN p.latpoint - (p.radius/p.distance_unit) 
       AND p.latpoint + (p.radius/p.distance_unit) 
      AND z.longitude 
      BETWEEN p.longpoint - (p.radius/(p.distance_unit * COS(RADIANS(p.latpoint)))) 
       AND p.longpoint + (p.radius/(p.distance_unit * COS(RADIANS(p.latpoint)))) 
     ) AS d 
     WHERE distance <= radius 
     ORDER BY distance; 
     END // 

回答

-1

我不認爲「爲Z」在第一內部聯接是必要的,如果你試圖讓表accounts_salon和accounts_zip的連接結果,並把它作爲第二左表內連接,然後繼續寫下一個內部連接。