2

ID のリスト (1、3、9、2、4、86) と、列 ID を持つテーブルがあるとします。一致する行がないリスト内のすべての番号を検索したい。

つまり、mysql テーブルが次のような場合:

id  letter
1   a
2   b
3   c
4   d
5   e
6   f
7   g

リストがあり(1, 3, 9, 2, 4, 86)、 を返すクエリが必要です(9, 86)

私が考えることができる唯一のことは、次のような非常に大きな仮想テーブルを構築することです:

select 1 as n union select 3 as n union select 9 as n union ....

それから私は反対することができます。より良い方法はありますか?これをすべてmysql内で実行できるようにしたいと考えています。補足として (関連があるとは思いませんが)、私のテーブルには約 10,000 行あり、使用しているリストには約 100 個の数字が含まれています。

4

3 に答える 3

3

最初にLISTcreateの要素を含むテーブルを作成する必要があります

すなわち(1, 3, 9, 2, 4, 86)

create table t
(
    num int
)
insert into t
values
(1),(3),(9),(2),(4),(86)

今、あなたは使用することができますNOT IN

SELECT num
FROM t
WHERE num not in (select id from letter_table);

SQL フィドル

コメントから。 編集:

テーブルに行かなくてもいい方法がありますcreate

select N from
(select 1 as N
union all
select 3 as N
union all
select 9 as N
union all
select 2 as N
union all
select 4  as N
union all
select 86 as  N)t1
where t1.N
not in (select id from letter_table)

New SQL Fiddleを参照してください。

OPが欲しいのはEdited Partだと思います。

PSテーブルt1がDBに存在しないことを確認してください

于 2013-04-11T13:48:41.207 に答える
1

ID を含むテーブルを作成すると、簡単に作成できます。デモンストレーションはこちら

SELECT
  S.id,
  ''   AS `letter`
FROM sequence S
WHERE S.id NOT IN(SELECT
                    id
                  FROM mytable)

SQL フィドルのデモ

于 2013-04-11T13:50:08.990 に答える
0

@Luvの回答で一時テーブルまたはメソッドを使用すると仮定すると、パフォーマンスが向上する可能性が高いため、を外部結合にUNION置き換えることを検討してください(もちろん、実際の環境とデータでテストしてください):NOT IN

SELECT num
FROM t
    LEFT OUTER JOIN letter_table
        ON t.num = letter_table.id
WHERE letter_table.id IS NULL;

UNION メソッドを使用する場合は、 に置き換えFROM tますFROM ([big UNION here]) t

于 2013-04-11T14:49:42.320 に答える