问题
我正在使用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
答案 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/,我们可以更好地使用它