我有一个由邮政编码范围搜索生成的数据集:
$zips:
key -> value
11967 -> 0.5
11951 -> 1.3
密钥是邮政编码(我需要查询数据库),值是用户输入的邮政编码的里程数。我需要使用密钥(邮政编码)并使用类似于我当前的MySQL查询来搜索数据库,最好:
$getlistings = mysql_query("SELECT * FROM stores WHERE zip IN ($zips)");
另一种选择是在我的代码中以某种方式更改数组。我试着在代码中查找最初生成数组的位置,但我找不到它。任何帮助将不胜感激!!谢谢:))
答案 0 :(得分:2)
您可以将数组键转换为SQL兼容字符串。例如:
'11967', '11951'
然后在查询中使用该字符串。
由于SQL查询不知道php数组是什么,并且没有好的方法(我知道)只提取键并用引号括起来,所以这可能是你最好的选择。
编辑:正如Ionut G. Stan所写(并举例说明),使用implode和 array_map 函数可以实现这一目标。但是,我相信提供的解决方案仅在列定义为数字时才有效。字符列要求元素被IN子句中的撇号包围。答案 1 :(得分:1)
array_keys
应该是您正在寻找的。 p>
$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);