クエリ:
select id from users where id in (1,2,3,4,5)
users テーブルに id 1、2、3 が含まれている場合、これは 1、2、および 3 を返します。4 と 5 を返すクエリが必要です。つまり、クエリが存在する行を返したくないということです。テーブルでは、数値のリストを指定し、そのリストからテーブルに表示されない値を取得したいと考えています。
(いくつかの適用できない回答に続いて、質問を明確にするために更新されました)
クエリ:
select id from users where id in (1,2,3,4,5)
users テーブルに id 1、2、3 が含まれている場合、これは 1、2、および 3 を返します。4 と 5 を返すクエリが必要です。つまり、クエリが存在する行を返したくないということです。テーブルでは、数値のリストを指定し、そのリストからテーブルに表示されない値を取得したいと考えています。
(いくつかの適用できない回答に続いて、質問を明確にするために更新されました)
一時テーブルを (明示的に) 使用したくない場合は、次のようにします。
SELECT id FROM (
(SELECT 1 AS id) UNION ALL
(SELECT 2 AS id) UNION ALL
(SELECT 3 AS id) UNION ALL
(SELECT 4 AS id) UNION ALL
(SELECT 5 AS id)
) AS list
LEFT JOIN users USING (id)
WHERE users.id IS NULL
しかし、これは非常に見苦しく、非常に長いため、ID のリストが長い場合にどのように機能するかは疑問です。
与えられた数字は固定リストです。私が考えることができる最も簡単な方法は、それらの数値が入力されたテストテーブルを用意して実行することです
テストされていない select ステートメント - ただし、princpal に従います。
select test.number
from test
left join
users
on
test.number = users.id
where test.number <> users.id
次に、一致する user.id を持たないすべての番号を取得するため、穴を埋めることができます..
別のオプションは、可能なすべての ID を含む別のテーブルを使用し、そこから選択を行うことです。
mysql> describe ids;
+-------+-----------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------------+------+-----+---------+-------+
| id | int(5) unsigned | NO | | 0 | |
+-------+-----------------+------+-----+---------+-------+
1 row in set (0.05 sec)
mysql> select * from ids;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+----+
5 rows in set (0.00 sec)
mysql> select * from users;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
+----+
3 rows in set (0.00 sec)
mysql> select id from ids where id not in (select id from users);
+----+
| id |
+----+
| 4 |
| 5 |
+----+
2 rows in set (0.04 sec)
追加された副作用 - ids テーブルに挿入することで結果リストを拡張できます
申し訳ありませんが、コメントを追加できません、@オースティン、
あなたは私の+1を持っています。
とにかく、これがmysqlで機能するかどうかはわかりませんが、値セットのアトミック選択連結ユニオンをすべて変更すると、次のようになります。
SELECT id FROM (
VALUES (1), (2), (3), (4), (5)
) AS list(id)
LEFT JOIN users USING (id)
WHERE users.id IS NULL