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

时间:2014-04-13 19:28:46

标签: 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_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)
";

我似乎无法通过邮政编码来订购这些公司,其顺序与从Zip Code类返回的顺序相同。 - 通过上述查询,每个" FIELD"独立。是否可以将数据库中所有返回的拉链代码放入可以按顺序排序的合并变量中?

感谢您对此有任何帮助或指示!

4 个答案:

答案 0 :(得分:0)

替换

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)
)

应该做的伎俩。

答案 1 :(得分:0)

COALESCE子句中的SELECT字段,然后按order by子句中的列号排序。像这样:

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
;

答案 2 :(得分:0)

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

答案 3 :(得分:0)

它应该是那样的

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;