MySQL:条件连接不显示用于计算纬度/长度之间距离的所有数据

时间:2016-03-15 00:28:26

标签: mysql sql

问题

我正在使用if语句执行条件连接,但它无法返回理想情况下我希望它返回的所有记录。

我的应用上的用户通过自动填充输入表单输入位置,并选择以英里为单位的距离。以下查询中的硬编码纬度/经度坐标是用户在表格中输入的位置的纬度/长度坐标(因此它是动态的),距离是用户输入的距离(也是动态的)。

查询应首先检查at_resources是否有"地方服务"与指定里程内的资源ID相关联。如果资源ID at_places_served表中未指定任何位置,则应使用zipcode_name表中的at_resources列作为后备。另请注意,zipcode_name可以是NULL

特别是,如果资源没有场所服务记录,它将使用其资源表记录来计算距离。

下面是我的代码和此特定查询返回的屏幕截图。

如果您希望我为您提供示例MySQL数据,请告知我们,以便了解表格的外观或进一步解释。

谢谢你和问候。

代码

SELECT resource.id id, resource.resource_name_line_1, resource.resource_name_line_2, resource.resource_handle, zips.zip_display_name, zips.lat, zips.long,
MIN((3959 * acos(cos(radians(42.3122)) * cos(radians(zips.lat))
* cos(radians(zips.long) - radians(-71.1947)) + sin(radians(42.3122))
* sin(radians(zips.lat))))) AS distance
FROM at_resources resource
JOIN at_resources_places_served places_served
ON places_served.resource_id = resource.id
JOIN at_zip_mapping zip_mapping
ON IF(places_served.resource_id IS NOT NULL, zip_mapping.zip_name_id = places_served.zipcode_name_id AND places_served.active = 1, zip_mapping.zip_name_id = resource.zipcode_name AND resource.active = 1) 
JOIN at_zips zips
ON zips.id = zip_mapping.zip_id
GROUP BY resource.id
HAVING distance < 25
ORDER BY distance, resource.resource_name_line_1 ASC

这是一个SQL小提琴:http://sqlfiddle.com/#!9/c17155/1

查询 enter image description here

2 个答案:

答案 0 :(得分:1)

试试这个:

SELECT 
   resource.id id, 
   resource.resource_name_line_1, 
   resource.resource_name_line_2, 
   resource.resource_handle, 
   zips.zip_display_name, 
   zips.lat, zips.long,
   MIN((3959 * acos(cos(radians(42.3122)) * cos(radians(zips.lat))
        * cos(radians(zips.long) - radians(-71.1947)) +
         sin(radians(42.3122))
        * sin(radians(zips.lat))))) AS distance
FROM at_resources resource
LEFT JOIN at_resources_places_served places_served
  ON places_served.resource_id = resource.id
LEFT JOIN at_zip_mapping zip_mapping_by_id
  ON 
     places_served.resource_id IS NOT NULL AND 
     zip_mapping_by_id.zip_name_id = places_served.zipcode_name_id AND 
     places_served.active = 1 
LEFT JOIN at_zip_mapping zip_mapping_by_zipcode
  ON 
     places_served.resource_id IS NULL AND 
     zip_mapping_by_zipcode.zip_name_id = resource.zipcode_name AND 
        resource.active = 1 
JOIN at_zips zips
   ON places_served.resource_id IS NOT NULL AND zips.id = zip_mapping_by_id.zip_id
JOIN at_zips zips_by_zipcode
   ON places_served.resource_id IS NULL AND 
      zips_by_zipcode.id = zip_mapping_by_zipcode.zip_id
GROUP BY resource.id
HAVING distance < 25
ORDER BY distance, resource.resource_name_line_1 ASC

<强>更新

如果places_served.resource_id不是NULL而且它们不是NULL,我用at_zips添加更多的条件连接。

答案 1 :(得分:0)

你所追求的是一些左连接:如果它没有要加入的东西而不是省略它,这将为行添加空值:

SELECT  resource.id id ,
    resource.resource_name_line_1 ,
    resource.resource_name_line_2 ,
    resource.resource_handle ,
    zips.zip_display_name ,
    zips.lat ,
    zips.long ,
    MIN(( 3959 * ACOS(COS(RADIANS(42.3122)) * COS(RADIANS(zips.lat))
                      * COS(RADIANS(zips.long) - RADIANS(-71.1947))
                      + SIN(RADIANS(42.3122)) * SIN(RADIANS(zips.lat))) )) AS distance
FROM at_resources resource
LEFT JOIN at_resources_places_served places_served ON places_served.resource_id = resource.id
LEFT JOIN at_zip_mapping zip_mapping    ON IF(places_served.resource_id IS NOT NULL, zip_mapping.zip_name_id = places_served.zipcode_name_id AND places_served.active = 1, zip_mapping.zip_name_id = resource.zipcode_name AND resource.active = 1) 

LEFT JOIN at_zips zips ON zips.id = zip_mapping.zip_id
GROUP BY resource.id
HAVING distance < 25
ORDER BY distance
, resource.resource_name_line_1 ASC

没有测试数据我真的无法测试你的ON语句看起来是否正常,一目了然,他们似乎正在为你做这个工作,所以手指交叉!如果没有,请尝试为我们设置http://sqlfiddle.com/,我们可以更好地使用它