3

IDのリストがあり、カンマ区切りで文字列として保存されています。

123,456,789

以前は、次のようなものを使用して、各IDが存在するデータベースの各行のデータをプルしていました。

SELECT id, name FROM line_item WHERE id IN (123,456,789)

ただし、データベースに存在しないIDのみを特定したいと思います。たとえば、テーブルをチェックして、DBに存在しない提供されたすべてのIDを返します。

私はNOT INそれがうまくいくと思ってみましたが、もちろん、私が得たのは私のサンプルと一致しないすべてのIDであり、それは膨大でした(数千行、通常チェックする必要のあるIDの数が少ない)。

SELECT id FROM line_item WHERE id NOT IN (123,456,789)

例えば:

テーブル:ID

111
222
333
444
555
777
999

弦:

111,222,666,888,999

クエリは次を返す必要があります:

666,888

MySQLを使用して、PHPを使用しないと存在しない値を見つけることができますか?

4

3 に答える 3

6

必要なid値が入力された追加のテーブルを作成し、LEFTJOIN句とWHERE句でクエリを使用できます-

CREATE TABLE temp_table(id INT);
INSERT INTO temp_table VALUES(123),(456),(789);

SELECT t1.id FROM temp_table t1
  LEFT JOIN line_item t2
    ON t1.id = t2.id
WHERE t2.id IS NULL;

別のバリアント:

SELECT t1.id FROM (SELECT 123 id UNION SELECT 456 UNION SELECT 789) t1
  LEFT JOIN line_item t2
    ON t1.id = t2.id
WHERE t2.id IS NULL;
于 2012-11-28T14:24:26.997 に答える
0

NOT INかっこ内の値を取得し、クエリで他のすべてのIDを取得します。

複数の数字を同時に使用してこれを行う方法があるかどうかはわかりませんが、1つでこれを行う方法は次のとおりです。

SELECT id, name, description
FROM line_item
WHERE 1 NOT IN (SELECT id FROM line_item) // Replace 1 with your numbers in a loop
于 2012-11-28T14:24:28.163 に答える
0

Postgresql では、関数を使用できますgenerate_series(i,j)。たとえば、id列に存在しない整数を見つけるには、次のように記述できます。

select i from generate_series(
    (select min(id) from line_item),(select max(id) from line_item)
) as i 
where i not in (select id from line_item);

このクエリを使用して、ID として使用できる最初の整数を見つけたい場合は、次のクエリを使用できます。

select min(i) from generate_series(
    (select min(id) from line_item),(select max(id) from line_item)+1
) as i 
where i not in (select id from line_item);
于 2015-05-07T07:39:55.783 に答える