我正在尝试构建一个查询,以查找距离邮政编码很近/很远的公司。
现在用户输入邮政编码(通过网络表单)和半径(1、5、10 英里等),我正在使用 this用于查找最近的邮政编码、半径、距离等的 PHP 类(效果很好)。然后我有一个查询,找到所有拥有这些邮政编码的公司并将它们列出来。
我遇到的问题是邮政编码存储在数据库中的三个位置。它们要么存储在公司表中,和/或其他两个相关表之一(下面的简化示例)。而且无论邮政编码字段在哪里,我都无法弄清楚如何通过邻近度对结果进行排序。
表格:
公司(表)id, name, zip
company_delivery (table) id, company_id (fk), zip
company_other_areas (table) id, company_id (fk), zip
$zip_codes 是从上面提到的邮政编码类输出的 zip 数组,其中它们被列为最接近最远的位置:
$zip_code_array = array(
90210,
90211,
90212
)
//* edited - thanks @crafter
$zip_codes = implode(', ', $zip_code_array);
我正在使用的查询
$sql="
SELECT
company.id, company.name, company.zip, company_delivery.zip, company_other_areas.zip
FROM
company
LEFT JOIN
company_delivery ON company.id = company_delivery.company_id
LEFT JOIN
company_other_areas ON company.id = company_other_areas.company_id
WHERE
company.zip IN($zip_codes) OR company_delivery.zip IN($zip_codes) OR company_other_areas.zip IN($zip_codes)
GROUP BY
company.id
ORDER BY
FIELD(company.zip, $zip_codes),
FIELD(company_delivery.postal_code, $zip_codes)
FIELD(company_other_areas.postal_code, $zip_codes)
";
我似乎无法弄清楚按邮政编码对公司进行排序,与从邮政编码类返回的顺序相同。 - 通过上面的查询,它独立地按每个“FIELD”排序。是否可以将数据库中所有返回的邮政编码放入一个可以排序的合并变量中?
感谢您对此的任何帮助或指点!
最佳答案
替换
FIELD(company.zip, $zip_codes),
FIELD(company_delivery.postal_code, $zip_codes)
FIELD(company_other_areas.postal_code, $zip_codes)
与
COALESCE(
FIELD(company.zip, $zip_codes),
FIELD(company_delivery.postal_code, $zip_codes)
FIELD(company_other_areas.postal_code, $zip_codes)
)
应该可以解决问题。
关于php - 具有多个 ORDER BY Field 语句的 SQL 查询 - 或者可能是一种新方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23047394/