在MySQL WHERE子句中使用数组“键”

时间:2009-08-18 16:11:51

标签: php mysql arrays

我有一个由邮政编码范围搜索生成的数据集:

$zips:

key -> value
11967 -> 0.5
11951 -> 1.3

密钥是邮政编码(我需要查询数据库),值是用户输入的邮政编码的里程数。我需要使用密钥(邮政编码)并使用类似于我当前的MySQL查询来搜索数据库,最好

$getlistings = mysql_query("SELECT * FROM stores WHERE zip IN ($zips)");

另一种选择是在我的代码中以某种方式更改数组。我试着在代码中查找最初生成数组的位置,但我找不到它。任何帮助将不胜感激!!谢谢:))

6 个答案:

答案 0 :(得分:2)

您可以将数组键转换为SQL兼容字符串。例如:

'11967', '11951'

然后在查询中使用该字符串。

由于SQL查询不知道php数组是什么,并且没有好的方法(我知道)只提取键并用引号括起来,所以这可能是你最好的选择。

编辑:正如Ionut G. Stan所写(并举例说明),使用implode和 array_map 函数可以实现这一目标。但是,我相信提供的解决方案仅在列定义为数字时才有效。字符列要求元素被IN子句中的撇号包围。

答案 1 :(得分:1)

array_keys应该是您正在寻找的。

$zip = array_keys($zips);      # gives you simple array(11967, 11951);
implode(', ', $zip);           # results in: '11967, 11951'

答案 2 :(得分:1)

不能评论其他答案,所以我的另一个评论。取决于您所在的国家/地区以及您对数据的处理方式...在德国,存在以“0”开头的邮政编码,因此如果您想要比较它们,您应确保不将它们存储为数值到其他数据(例如ZIP< - > geocoord-mappings)或确保在任何地方将它们转换为int并在输出上使用过滤。

旧邮政编码有四个数字,新邮编有五个。因此,显示一个包含四个数字的新ZIP,因为缺少前导0会导致混淆。

关于临时表的使用,我会说它取决于表的大小以及查询中使用了多少个邮政编码。

答案 3 :(得分:0)

为了获得最佳性能,您应该创建一个临时表,填写您的邮政编码并查询如下:

SELECT  *
FROM    stores
JOIN    temptable
ON      zip = tempvalue

当然,只有当ZIP列被编入索引时,这才会更有效。

答案 4 :(得分:0)

这应该这样做:

// array_map sanitizes the data
$zip_codes = implode(', ', array_map('intval', array_keys($zips)));
$getlistings = mysql_query("SELECT * FROM stores WHERE zip IN ($zip_codes)");

答案 5 :(得分:0)

我只是想抛出以前的代码片段给了我一些语法错误,数据库只是吐出一个条目而不是所有相关数据。以下代码段对我有用:

implode("','", $zipNumbers);