MySQL テーブルの一意の列に関連付けられた ID の配列があります。データベースに表示されない配列から ID を取得する方法はありますか? データベース全体を選択して PHP と比較することでそれを実行できることはわかっていますが、テーブルがかなり大きくなる可能性があるため、これはあまり良い考えではないように思えます。
6 に答える
次の 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 を実行します。欠落している値は、「見つかった」配列ではなく、元の配列にのみ存在するため、ポップアウトされます。
はい、できます。列 (ID) を UNIQUE 制約として定義します。データベースにあるかどうかを確認するには、挿入クエリに無視キーワードを追加します。
同様の質問があります。
ここで解決策を見つけることができます:
重複を避けるために値が既に存在するかどうかを確認する方法は?存在する場合は何もせず、それ以外の場合はレコードをデータベースに挿入します
これが役立つことを願っています..
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を識別する効率的な方法を探していると思います。クエリを実行する方法は 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() を移動できるかどうかわかりません。
ヘルプはありますか?