gpt4 book ai didi

php - 如何选择 ID 不在 PHP 大数组中的行?

转载 作者:行者123 更新时间:2023-11-29 01:38:57 25 4
gpt4 key购买 nike

我需要解决以下任务:我在 PHP 脚本中有一个非常大的 ID 数组,我需要从 MySQL DB 中选择 ID 为 NOT IN 这个数组的所有行。

有几个类似的问题 (How to find all records which are NOT in this array? (MySql)),最喜欢的答案是使用 NOT IN () 构造,其中包含 implode(',',$array)一个括号。

这很有效...直到我的阵列礼服达到 2007 个 ID 和大约 20 kB(在我的例子中)我得到一个“MySQL 服务器已经消失”错误。据我了解,这是因为查询时间过长。

这个问题也有一些解决方案,比如:

SET GLOBAL max_allowed_packet=1073741824;

(刚摘自 this 问题)。

也许我可以用这种方式做到这一点,但是现在我怀疑 NOT IN (implode) 方法对于大数组来说是一个很好的方法(我希望在我的情况下数组可以达到8000 个 ID 和 100 kB)。

对于大数组有没有更好的解决方案?

谢谢!

编辑 1

作为一种解决方案,建议将数组中的所有 ID 插入临时表,而不是使用 JOIN 来解决初始任务。这很清楚。但是我从来没有使用过临时表,因此我有一些额外的问题(可能值得作为一个单独的问题,但我决定把它留在这里):

如果我需要在一个 MySQL session 期间多次执行此例程,哪种方法会更好:

  1. 每次我需要SELECT ID NOT IN PHP array时,我都会创建一个新的临时表(所有这些表都将在 MySQL 连接终止后删除 - 在我的脚本将终止于事实)。

  2. 我将创建一个临时表,并在我做出需要的 SELECT 后删除一个

  3. 之后我会TRNCATE一个临时表。

哪个更好?还是我漏掉了什么?

最佳答案

在这种情况下,通常最好创建一个临时表并对其执行查询。大概是这样的:

CREATE TEMPORARY TABLE t1 (a int);

INSERT INTO t1 VALUES (1),(2),(3);

SELECT * FROM yourtable
LEFT JOIN t1 on (yourtable.id=t1.a)
WHERE t1.a IS NULL;

当然应该构建 INSERT 语句,以便将数组中的所有值插入到临时表中。

编辑:在单个 INSERT 语句中插入所有值很可能会导致您已经遇到的相同问题。因此,我建议您使用 prepared statement当您遍历 PHP 数组时,将执行该命令以将数据插入临时表。

关于php - 如何选择 ID 不在 PHP 大数组中的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31400425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com