2017-04-14 96 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的连接结果,并把它作为第二左表内连接,然后继续写下一个内部连接。