4

私はこのような「ユーザー」SQLテーブル構造を持っています(IDはランダムに生成され、自動インクリメントされません):

ID    name     deleted    lastActive
3242  Joe      0          20-6-2012 23:14
2234  Dave     0          20-6-2012 23:13
2342  Simon    1          20-6-2012 23:02
9432  Joe      1          20-6-2012 22:58

同じ名前の複数の削除済み (deleted=1) ユーザーが存在する可能性がありますが、同じ名前の削除されていないユーザーは 1 人だけです (したがって、Simon の追加は問題ありませんが、Dave はそうではありません)。1 つの SQL クエリで、同じ名前で削除済み = 0 のレコードが存在しない場合にのみ挿入するにはどうすればよいですか? 私はこのようなものが必要です:

INSERT INTO users (ID, name) VALUES ($id, $name) 
    WHERE NOT EXISTS (SELECT 1 FROM users WHERE name = $name AND deleted = 0)

しかし、これは正しい構文ではありません。

4

4 に答える 4

3

でLEFT JOINをセットアップします

  • ID としてエイリアス化された乱数と名前としてエイリアス化された $name を含むサブクエリ A。
  • サブクエリ B は、削除されていない name = $name を選択します。
  • LEFT JOIN A を B に変換し、LEFT JOIN に対応する右側がない場合は A.* を返します。

これがクエリです

INSERT INTO users (ID,name)
SELECT A.* FROM
(SELECT RAND() ID,'$name' name) A LEFT JOIN
(SELECT name FROM users WHERE name='$name' AND deleted=0) B
USING (name) WHERE B.name IS NULL;
于 2012-06-21T20:50:23.697 に答える
1

MySQL の REPLACE 構文を使用します。

ID が主キーまたは一意のキーであることを確認し、3 つの ID、名前、および削除された列すべてにインデックスを作成します。

REPLACE INTO users (ID, name) VALUES ($id, $name) 
于 2012-06-21T20:02:28.243 に答える
0
INSERT INTO users (ID, name) 
SELECT $id, $name WHERE NOT EXISTS (
    SELECT 1 FROM users WHERE name = $name AND deleted = 0
)
于 2012-06-21T19:46:52.473 に答える
0
INSERT INTO users SELECT '1', 'Bob','','' FROM DUAL WHERE NOT EXISTS(SELECT ID FROM users WHERE name = 'Bob' AND deleted ='0' LIMIT 1)
于 2012-06-21T20:11:46.440 に答える