我有一个与MySQL表中的唯一列相关的ID数组,有没有办法从数组中获取未出现在数据库中的ID?我知道我可以通过选择整个数据库并与PHP进行比较来做到这一点,但表格可能会变得非常大,所以这对我来说似乎不是一个好主意。
答案 0 :(得分:3)
您可以使用类似
的内容SELECT * FROM your_table WHERE ID NOT IN( your_ids )
我已经在oracle上测试了大约2K的ID数组并且性能仍然可用,但我必须承认它不是最好的解决方案(请注意,在oracle和其他DB中,IN中的1K项也存在约束()条件)。
或者您可以从ID数组中创建临时表,并使用更清洁的表格进行JOIN。
答案 1 :(得分:1)
分两个阶段进行:
$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
。丢失的值将弹出,因为它们只会在原始数组中,而不是“找到”数组。
答案 2 :(得分:0)
是的,你可以。将列(ID)定义为UNIQUE约束。并且为了检查它是否在数据库中:在插入查询中添加ignore关键字。
我有类似的问题。
您可以在此处找到解决方案:
希望这可能有所帮助..
答案 3 :(得分:0)
您可以执行以下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);
运行此代码,您将获得 imploded 字符串。然后你可以在MySQL或phpMyAdmin中执行SQL。
希望这会对你有所帮助。
答案 4 :(得分:0)
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是数字。谢谢!
答案 5 :(得分:-1)
我知道你的意思。我也误解了你的问题,并且会在上面提出一些建议。 我认为您正在寻找一种有效的方法来识别数组中不在表中的ID。实际上没有一种查询方式。 虽然我的PHP中没有做很多mysql,但我在oracle的工作倾向于使用绑定变量并循环遍历数组来查看准备查询。
您是否看过PHP中Mysqli扩展中的prepare方法?
按照“从IDTABLE中选择count(1)来确定查询,其中ID =?”您可以使用与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-&gt; bid_result()向上移动到bind_param旁边。
任何帮助?