php - 具有多个 ORDER BY Field 语句的 SQL 查询 - 或者可能是一种新方法?

标签 php mysql sql yii

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

现在用户输入邮政编码(通过网络表单)和半径(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/

相关文章:

javascript - 如何将 PHP 变量传递给processing.js

mysql - 解决错误can't connect to local MySQL server through socket '/usr/local/zend/mysql/tmp/mysql.sock' (2) in/Applications/MAMP/htdocs

php - MySQL 选择高效的第一行和最后一行

java - 从具有空值的数组动态填充 Java 中的 SQL

sql - 如何在 SQL Server 中查询此输出

php - 如何在 MacOS 上将 PHP 编译为静态二进制文件?

php - PHPUnit 中的模拟 - 具有不同参数的同一方法的多个配置

php - 在生产站点上获得干净的错误日志是否值得?

mysql - 通过使用 LIMIT 1 和 WHERE 子句匹配表之外的列值的 SELECT 子查询来连接表

mysql快速选择查询而不读取所有数据库