假设我在php数组中有一个字符串数组,名为$ foo,有几百个条目,我有一个MySQL表'people',它有一个名为'name'的字段,有几千个条目。在没有为$ foo中的每个字符串提交查询的情况下,找出$ foo中哪些字符串不是“人员”条目中的“名称”的有效方法是什么?
所以我想知道$ foo中的哪些字符串尚未输入'people。'
请注意,很明显,所有数据都必须在一个盒子上。目标是同时最大限度地减少查询次数和php处理量。
答案 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)
以下内容如何:
SELECT name FROM people WHERE name IN (imploded list of names)
array_diff()
如果你想在SQL中完全完成它:
INSERT ... SELECT
放入人员表。虽然第二种选择可能稍快一些,但两者都不会非常快。
答案 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;