问题
我正在使用 if
语句执行条件连接,但它未能返回我理想情况下期望它返回的所有记录。
我的应用程序上的用户通过自动完成输入表单输入位置,并选择以英里为单位的距离。下面的查询中的硬编码纬度/经度坐标是用户在表单中输入的位置的纬度/经度坐标(因此它是动态的),距离是用户输入的以英里为单位的距离(也是动态的)。
查询应首先检查 at_resources
是否具有与其指定英里内的资源 ID 关联的“服务地点”。如果资源 ID 在 at_places_served
表中没有指定任何位置,则应使用 at_resources
中的 zipcode_name
列> 表作为后备。另请注意 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 fiddle :http://sqlfiddle.com/#!9/c17155/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不为空或者不为空,我会使用at_zips添加更多条件连接。
关于MySQL:条件连接不显示用于计算纬度/经度之间距离的所有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36000620/