-1

製品IDの配列があり、データベースに存在しないIDを見つける必要があります。確かに私はこのようにそれを行うことができます:

// IDs in database: 1, 2, 3, 4, 5.
$products = array(4, 5, 6, 7);

$in_db = $db->exec("SELECT `id` FROM `table` WHERE `id` IN (" . implode($products) . ");");    
$in_db_ids = array();

foreach($in_db as $i){
    $in_db_ids[] = $i['id'];
}

$missing = array_diff($products, $in_db_ids);

しかし、これは長くて退屈です。私はこのようなことについても考えました:

// this query would be generated with PHP using an implode or something
$query = "
    SELECT `t`.`id` as `missing`
    SELECT 4 as `id` UNION SELECT 5 UNION SELECT 6 UNION SELECT 7
    LEFT JOIN `table` USING(`id`)
    WHERE `missing` is NULL;
";
$missing = $db->exec($query);

しかし、これはとてもエレガントではありません。私はそれを書くための適切な方法があるべきだと思いますSELECT x UNION SELECT y UNION SELECT z、あるいはこのチェックをする別の良い方法があるかもしれません。どう思いますか?

4

1 に答える 1

1

MySQLデータベースでこれを行うには、欠落しているブランクをスキャンしているテーブルの最高のインデックスに等しい行数を持つテーブルまたは一時テーブルが必要になります。これを回避する方法はありません。MySQLは常にテーブルを「ループ」します。これは、独自のループを設定できる手続き型言語ではありません。

そうは言っても、十分なサイズのテーブルを作成または持っている場合は、ユーザー変数を使用して自然数シーケンスを作成できます。大きなテーブルを呼び出しましょうbigtable(どの列が含まれているかは関係ありません。列の1つの名前が必要です。「acolumn」を使用します)。

set @row = 0;
select n from 
  (select @row := @row + 1 as n from bigtable) as t 
left join mytable on mytable.id = t.n 
where mytable.acolumn is null;

もう少し説明が必要な場合はお知らせください。

于 2012-04-04T02:05:21.743 に答える