40

クエリ:

select id from users where id in (1,2,3,4,5)

users テーブルに id 1、2、3 が含まれている場合、これは 1、2、および 3 を返します。4 と 5 を返すクエリが必要です。つまり、クエリが存在する行を返したくないということです。テーブルでは、数値のリストを指定し、そのリストからテーブルに表示されない値を取得したいと考えています。

(いくつかの適用できない回答に続いて、質問を明確にするために更新されました)

4

6 に答える 6

21

一時テーブルを (明示的に) 使用したくない場合は、次のようにします。

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 のリストが長い場合にどのように機能するかは疑問です。

于 2014-11-21T03:26:59.270 に答える
16

与えられた数字は固定リストです。私が考えることができる最も簡単な方法は、それらの数値が入力されたテストテーブルを用意して実行することです

テストされていない select ステートメント - ただし、princpal に従います。

select test.number 
from test 
left join 
    users 
on 
    test.number = users.id 
where test.number <> users.id

次に、一致する user.id を持たないすべての番号を取得するため、穴を埋めることができます..

于 2012-04-04T14:50:29.233 に答える
3

別のオプションは、可能なすべての 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 テーブルに挿入することで結果リストを拡張できます

于 2012-04-04T15:00:34.653 に答える
-2

申し訳ありませんが、コメントを追加できません、@オースティン、

あなたは私の+1を持っています。

とにかく、これがmysqlで機能するかどうかはわかりませんが、値セットのアトミック選択連結ユニオンをすべて変更すると、次のようになります。

SELECT id FROM (
    VALUES (1), (2), (3), (4), (5)
) AS list(id)
LEFT JOIN users USING (id)
WHERE users.id IS NULL
于 2015-12-18T08:59:27.680 に答える