我有一个与 MySQL 表中唯一列相关的 ID 数组,有没有办法从数据库中没有出现的数组中获取 ID?我知道我可以通过选择整个数据库并与 PHP 进行比较来做到这一点,但是表可能会变得很大,所以这对我来说似乎不是一个好主意。
6 回答
你可以使用类似的东西
SELECT * FROM your_table WHERE ID NOT IN( your_ids )
我在 oracle 上用大约 2K 的 ID 数组对此进行了测试,性能仍然可用,但我必须承认这不是最好的解决方案(注意在 oracle 和其他数据库中,IN() 条件下也有 1K 项的限制)。
或者,您可以从 ID 数组制作临时表,并与您的表进行 JOIN,这样会更干净一些。
分两个阶段进行:
$ids = implode(',', $your_array);
SELECT id FROM thetable WHERE id IN ($ids);
$found_ids = array();
while($row = fetch($result)) {
$found_ids[] = $row['id'];
}
$missing = array_diff($your_array, $found_ids);
基本上:使用您的 id 数组从数据库中选择任何匹配的记录。数组中没有匹配记录的任何 id 显然不会被返回。获取该结果集,将其填充到另一个数组中。然后diff
在两个数组之间做一个。缺失的值会弹出,因为它们只会出现在原始数组中,而不是“找到”的数组中。
您可以执行以下 sql:
<?php
$ids = implode(',', $YOUR_ARRAY_OF_IDS);
$sql = "SELECT * FROM table_name WHERE ID NOT IN(".$ids.") ORDER by ID ASC;"
如果您不喜欢在 PHP 中运行 sql,那么您只需执行以下操作:
<?php
echo $ids = implode(',', $YOUR_ARRAY_OF_IDS);
运行此代码,您将获得内爆字符串。然后你可以在 MySQL 或 phpMyAdmin 中执行 SQL。
希望这对您有所帮助。
是的你可以。将您的列(ID)定义为唯一约束。并检查它是否在数据库中:在插入查询中添加忽略关键字。
我有类似的问题。
您可以在这里找到您的解决方案:
如何检查一个值是否已经存在以避免重复?如果存在则什么都不做,否则将记录插入数据库
希望这可能会有所帮助..
select (t.id + 1) as id from table_name t where not exists (
select * from table_name t2 where t2.id = (t.id + 1)
)
假设您的 ID 是数字。谢谢!
我知道你的意思。我也误读了您的问题,并打算按照上述思路提出一些建议。我认为您正在寻找一种有效的方法来识别数组中不在表中的 ID。实际上没有一种查询方式可以做到这一点。虽然我没有在我的 PHP 中做很多 mysql,但我与 oracle 的工作倾向于着眼于准备查询、使用绑定变量和循环遍历你的数组。
你看过 PHP 中 Mysqli 扩展中的 prepare 方法吗?
按照“从 IDTABLE where ID=? 中选择 count(1)”的行准备查询 对于函数/方法,您可以使用类似于 PHP 手册中示例的代码:
http://www.php.net/manual/en/mysqli.prepare.php
对我来说看起来很有希望。
代码将是这样的:
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$ID = 0;
/* create a prepared statement */
if ($stmt = $mysqli->prepare("SELECT count(*) FROM IDTABLE ID=?")) {
/* bind parameters for markers */
$stmt->bind_param("i", $ID);
$not_in=array();
$in=array();
foreach ($my_ids as $ID) {
/* execute query */
$stmt->execute();
/* bind result variables */
$stmt->bind_result($matches);
/* fetch value */
$stmt->fetch();
if ($matches == 0) {
$not_in[]=$ID;
} else {
$in[]=$ID;
}
}
/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();
?>
不确定是否可以将 $stmt->bid_result() 移到 bind_param 旁边 - 在循环之前。
有什么帮助吗?