Php 使用多个ORDER BY Field语句的SQL查询-或者是一种新方法?

Php 使用多个ORDER BY Field语句的SQL查询-或者是一种新方法?,php,mysql,sql,yii,Php,Mysql,Sql,Yii,我正在尝试构建一个查询,以查找距离邮政编码较近/较远的公司 现在,一个用户通过web表单输入一个邮政编码,半径1、5、10英里等等,我正在使用PHP类查找最近的邮政编码、半径、距离等等,这非常有效。然后我有一个查询,找到所有有这些邮政编码的公司,并列出它们 我遇到的问题是,邮政编码存储在数据库中的三个位置。它们存储在companys表中,和/或下面两个相关表中的一个。而且我不知道如何根据邻近性排序结果,而不管邮政编码字段在哪里 表: 公司表id、名称、邮政编码 公司交货表id,公司id fk,邮

我正在尝试构建一个查询,以查找距离邮政编码较近/较远的公司

现在,一个用户通过web表单输入一个邮政编码,半径1、5、10英里等等,我正在使用PHP类查找最近的邮政编码、半径、距离等等,这非常有效。然后我有一个查询,找到所有有这些邮政编码的公司,并列出它们

我遇到的问题是,邮政编码存储在数据库中的三个位置。它们存储在companys表中,和/或下面两个相关表中的一个。而且我不知道如何根据邻近性排序结果,而不管邮政编码字段在哪里

表:

公司表id、名称、邮政编码

公司交货表id,公司id fk,邮政编码

公司其他地区表id,公司id fk,邮政编码

$zip_codes是从上面提到的zip code类输出的一个zip数组,其中列出的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)
";
我似乎不知道如何按邮政编码订购这些公司,它们的顺序与从邮政编码类返回的顺序相同。-通过上述查询,it将按每个字段独立排序。是否可以将从数据库返回的所有ZIP代码放入一个合并的变量中,该变量可以按排序

谢谢你在这方面的帮助和指点

更换

FIELD(company.zip, $zip_codes),
FIELD(company_delivery.postal_code, $zip_codes)
FIELD(company_other_areas.postal_code, $zip_codes)

应该可以做到这一点。

我将合并SELECT子句中的字段,然后在ORDERBY子句中按列编号排序。像这样:

SELECT company.id, 
       company.name, 
       COALESCE(company.zip, company_delivery.zip, company_other_areas.zip) AS zip_code
  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 3
;

使用union,将创建一个临时表,其中包含来自三个查询的记录,order by子句将对记录进行排序,而不管查询的顺序如何。

应该是这样的

SELECT company.name, a.company_id, a.zip FROM ( SELECT id AS company_id, zip FROM company UNION ALL SELECT company.id, zip FROM company_delivery  UNION ALL SELECT company.id, zip FROM company_other_areas ) a JOIN company ON a.company_id = company.id ORDER BY a.zip;

谢谢你的回复!正如你所建议的,我试图使用COALESCE,但结果仍然有些随机。即,邮政编码为90212的公司在邮政编码为90210的公司之前上市。有没有办法将这三个表的结果合并到一个新的temp变量中以便排序?再次感谢!COALESCE所做的只是在提供的值中选择第一个非NULL值。您还需要什么吗?您可以使用UNION合并表,谢谢这似乎是个好主意,但是三个zip表都具有同等的优先级。或者,也许我只是不明白?您能给我一个例子,说明使用UNION w/相关表时查询是什么样子的吗?MySQL抱怨表的列数/列数不匹配。
SELECT company.name, a.company_id, a.zip FROM ( SELECT id AS company_id, zip FROM company UNION ALL SELECT company.id, zip FROM company_delivery  UNION ALL SELECT company.id, zip FROM company_other_areas ) a JOIN company ON a.company_id = company.id ORDER BY a.zip;