代码之家  ›  专栏  ›  技术社区  ›  Chris Bier

在mysql where子句中使用数组“keys”

  •  1
  • Chris Bier  · 技术社区  · 17 年前

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

    $zips:
    
    key -> value
    11967 -> 0.5
    11951 -> 1.3
    

    关键字是邮政编码(我需要查询数据库中的邮政编码),值是距离用户输入的邮政编码英里数。我需要取下钥匙(邮政编码)搜索数据库, 更可取地 使用类似于我当前的MySQL查询:

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

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

    6 回复  |  直到 17 年前
        1
  •  1
  •   SilentGhost    17 年前

    array_keys 应该是你想要的。

    $zip = array_keys($zips);      # gives you simple array(11967, 11951);
    implode(', ', $zip);           # results in: '11967, 11951'
    
        2
  •  2
  •   Michael Todd    17 年前

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

    '11967', '11951'
    

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

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

    编辑:正如G.斯坦所写(并给出了一个例子),使用内爆和 阵列映射 功能会让你达到目的。然而,我 相信 仅当列定义为数字时,提供的解决方案才有效。字符列需要在in子句中用撇号包围元素。

        3
  •  1
  •   kbeyer    17 年前

    不能评论其他答案,所以我另加一句话。取决于你所在的国家和你如何处理这些数据…在德国,有以“0”开头的邮政编码,因此,如果要将它们与其他数据(例如,zip<->geocoord映射)进行比较,请确保不将它们存储为数值,或者确保将它们转换为处处int并对输出使用筛选。

    旧的邮政编码有四个号码,新的有五个。因此,由于缺少前导0,显示带有四个数字的新zip将导致混乱。

    关于临时表的使用,我认为这取决于表的大小以及查询中使用了多少邮政编码。

        4
  •  0
  •   Ionuț G. Stan    17 年前

    应该这样做:

    // 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
  •   Quassnoi    17 年前

    为了获得最佳性能,您应该创建一个临时表,用邮政编码填充它,然后像这样进行查询:

    SELECT  *
    FROM    stores
    JOIN    temptable
    ON      zip = tempvalue
    

    当然,只有当你 ZIP 列已编入索引。

        6
  •  0
  •   mik    17 年前

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

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