0

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

4

6 回答 6

3

你可以使用类似的东西

SELECT * FROM your_table WHERE ID NOT IN( your_ids )

我在 oracle 上用大约 2K 的 ID 数组对此进行了测试,性能仍然可用,但我必须承认这不是最好的解决方案(注意在 oracle 和其他数据库中,IN() 条件下也有 1K 项的限制)。

或者,您可以从 ID 数组制作临时表,并与您的表进行 JOIN,这样会更干净一些。

于 2013-07-04T18:45:46.143 回答
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在两个数组之间做一个。缺失的值会弹出,因为它们只会出现在原始数组中,而不是“找到”的数组中。

于 2013-07-04T21:33:20.300 回答
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);

运行此代码,您将获得内字符串。然后你可以在 MySQL 或 phpMyAdmin 中执行 SQL。

希望这对您有所帮助。

于 2013-07-04T18:44:36.933 回答
0

是的你可以。将您的列(ID)定义为唯一约束。并检查它是否在数据库中:在插入查询中添加忽略关键字。

我有类似的问题。

您可以在这里找到您的解决方案:

如何检查一个值是否已经存在以避免重复?如果存在则什么都不做,否则将记录插入数据库

希望这可能会有所帮助..

于 2013-07-04T18:40:02.667 回答
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 是数字。谢谢!

于 2013-07-04T19:06:54.920 回答
-1

我知道你的意思。我也误读了您的问题,并打算按照上述思路提出一些建议。我认为您正在寻找一种有效的方法来识别数组中不在表中的 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 旁边 - 在循环之前。

有什么帮助吗?

于 2013-07-04T19:02:35.540 回答