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

4
假设我有一个包含几百个条目的PHP数组$foo,其中包含一些字符串,并且我有一个名为“people”的MySQL表,其中有一个名为“name”的字段,其中包含数千个条目。 有没有一种有效的方法可以找出$foo中哪些字符串不是“people”条目中的“name”,而无需为$foo中的每个字符串提交查询?
因此,我想找出$foo中尚未在“people”中输入的字符串。
请注意,显然所有数据在某一时刻都必须在一个盒子上。 目标是在最小化查询数量和PHP处理量的同时完成此操作。
7个回答

1

我会把你的$foo数据放到另一张表里,然后与你的名字表做一个LEFT OUTER JOIN。否则,在某些情况下,没有太多好的方法可以做到这一点,而不涉及迭代。


你如何使用LEFT JOIN来返回$foo日期不在names表中的数据? - Steven Noble

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包含用户输入,则必须首先进行转义。

啊!没有占位符!不要加引号!不要转义! - bart
好的,注释行显然是伪代码。我没有提到转义字符的缺失吗?不过没有引用确实是我的疏忽,抱歉。 - jakber

1

以下是一些可能的解决方案:

  1. 使用类似于以下代码的方法获取已经存在于数据库中的名称列表: SELECT name FROM people WHERE name IN (implode(数组名称))
  2. array_diff()返回的每个项目插入到数据库中。

如果您想完全使用SQL完成:

  1. 创建一个临时表,其中包含PHP数组中的每个名称。
  2. 执行查询以填充第二个临时表,该表仅包括新名称。
  3. 从第二个临时表中进行INSERT ... SELECT操作,将数据插入到people表中。

这两种方法都不会非常快,但第二种方法可能会稍微快一些。


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

哎呀,这看起来根本无法很好地扩展。


应该使用“AND”,而不是“OR”。 - Lucas Oman

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;

0

我不确定除了将所有字符串提交到数据库中,是否有更高效的方法。

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

您可以创建一个临时表,但无论哪种方式,都需要将所有数据推送到数据库中。


你能举个长的 select 语句的例子吗? - Steven Noble
经过进一步的思考,长时间的选择可能行不通,你需要接受临时表的想法作为正确答案。 - acrosman

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接