如何使用MySQL表过滤php数组?

时间:2008-10-21 00:46:18

标签: php mysql

假设我在php数组中有一个字符串数组,名为$ foo,有几百个条目,我有一个MySQL表'people',它有一个名为'name'的字段,有几千个条目。在没有为$ foo中的每个字符串提交查询的情况下,找出$ foo中哪些字符串不是“人员”条目中的“名称”的有效方法是什么?

所以我想知道$ foo中的哪些字符串尚未输入'people。'

请注意,很明显,所有数据都必须在一个盒子上。目标是同时最大限度地减少查询次数和php处理量。

7 个答案:

答案 0 :(得分:1)

我将你的$ foo数据放在另一个表中并使用你的名字表进行LEFT OUTER JOIN。否则,没有很多很好的方法可以在某些时候进行迭代。

答案 1 :(得分:1)

我可以在没有使用临时表的情况下提出的最佳结果是:

 $list = join(",", $foo);

// fetch all rows of the result of 
// "SELECT name FROM people WHERE name IN($list)" 
// into an array $result

$missing_names = array_diff($foo, $result);

请注意,如果$ foo包含用户输入,则必须先进行转义。

答案 2 :(得分:1)

以下内容如何:

  1. 使用以下内容获取已在数据库中的名称列表: SELECT name FROM people WHERE name IN (imploded list of names)
  2. array_diff()
  3. 的返回中插入每个项目

    如果你想在SQL中完全完成它:

    1. 使用PHP数组中的每个名称创建一个临时表。
    2. 执行查询以填充仅包含新名称的第二个临时表。
    3. 从第二个临时表中将INSERT ... SELECT放入人员表。
    4. 虽然第二种选择可能稍快一些,但两者都不会非常快。

答案 3 :(得分:0)

我不确定除了将所有字符串提交到数据库之外,还有更有效的方法。

基本上有两种选择:获取MySQL中所有字符串的列表并将它们拉入PHP并进行比较,或者将所有字符串列表发送到MySQL服务器并让它进行比较。除非数据库中的列表比PHP中的列表小得多,否则MySQL将比PHP更快地进行比较。

您既可以创建临时表,也可以将所有数据推送到数据库。

答案 4 :(得分:0)

对于几百个条目,只需使用array_diff()或array_diff_assoc()

答案 5 :(得分:0)

$query = 'SELECT name FROM table WHERE name != '.implode(' OR name != '. $foo);

Yeash,看起来并不像它可以很好地扩展。

答案 6 :(得分:0)

CREATE TEMPORARY TABLE PhpArray (name varchar(50));

-- you can probably do this more efficiently
INSERT INTO PhpArray VALUES ($foo[0]), ($foo[1]), ...;

SELECT People.*
FROM People
 LEFT OUTER JOIN PhpArray USING (name)
WHERE PhpArray.name IS NULL;