0

MySQL テーブルの一意の列に関連付けられた ID の配列があります。データベースに表示されない配列から ID を取得する方法はありますか? データベース全体を選択して PHP と比較することでそれを実行できることはわかっていますが、テーブルがかなり大きくなる可能性があるため、これはあまり良い考えではないように思えます。

4

6 に答える 6

1

次の 2 段階で行います。

$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 の配列を使用して、DB から一致するレコードを選択します。一致するレコードがない配列内の ID は、明らかに返されません。その結果セットを取得して、別の配列に詰め込みます。次にdiff、2 つの配列間で a を実行します。欠落している値は、「見つかった」配列ではなく、元の配列にのみ存在するため、ポップアウトされます。

于 2013-07-04T21:33:20.300 に答える
0

はい、できます。列 (ID) を UNIQUE 制約として定義します。データベースにあるかどうかを確認するには、挿入クエリに無視キーワードを追加します。

同様の質問があります。

ここで解決策を見つけることができます:

重複を避けるために値が既に存在するかどうかを確認する方法は?存在する場合は何もせず、それ以外の場合はレコードをデータベースに挿入します

これが役立つことを願っています..

于 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を識別する効率的な方法を探していると思います。クエリを実行する方法は 1 つではありません。私は PHP で多くの mysql を実行していませんが、oracle での作業は、変数のバインドと配列のループを使用して、クエリの準備を検討することに傾いています。

PHP の Mysqli 拡張機能の prepare メソッドを見たことがありますか?

「select count(1) from IDTABLE where 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();
?>

ループの前に、bind_param の横に $stmt->bid_result() を移動できるかどうかわかりません。

ヘルプはありますか?

于 2013-07-04T19:02:35.540 に答える