如果不选择整个数据库并与PHP进行比较,如何获得数据库中尚未存在的ID

时间:2013-07-04 18:35:14

标签: php mysql

我有一个与MySQL表中的唯一列相关的ID数组,有没有办法从数组中获取未出现在数据库中的ID?我知道我可以通过选择整个数据库并与PHP进行比较来做到这一点,但表格可能会变得非常大,所以这对我来说似乎不是一个好主意。

6 个答案:

答案 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关键字。

我有类似的问题。

您可以在此处找到解决方案:

How to check if a value already exists to avoid duplicates?If it exist then do nothing otherwise insert record into database

希望这可能有所帮助..

答案 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旁边。

任何帮助?