2012-06-21 96 views
4

我有一個這樣的「用戶」 SQL表結構(隨機生成的ID,而不是自增):INSERT成表,如果一個不同的結果不存在

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 

可以有多個刪除(已刪除= 1)名稱相同的用戶,但只有1名具有相同名稱的未刪除用戶(因此添加Simon很好,但Dave不是)。只有在一個SQL查詢中沒有已經具有相同名稱和已刪除= 0的記錄的情況下如何插入?我需要這樣的:

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

但是這是不正確的語法。

+0

爲什麼不乾脆 '不刪除' 的用戶名? –

+0

@MarcB,因爲它將是具有不同ID的新用戶。用戶名被設置爲在5分鐘的非活動後被刪除,以便其他人可以使用它們,但我無法完全從表中刪除它們,因爲我需要能夠將它們稍後鏈接到報告中 – Timm

回答

3

設置一個LEFT JOIN與

  • 子查詢中包含您的別名爲別名爲名稱標識和$ name隨機數。
  • 子查詢B選擇未被刪除的名稱= $名稱。
  • LEFT JOIN A到B和回報A. *如果它不具有右側對應的LEFT JOIN

這是查詢

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; 
0
INSERT INTO users (ID, name) 
SELECT $id, $name WHERE NOT EXISTS (
    SELECT 1 FROM users WHERE name = $name AND deleted = 0 
) 
+0

我收到語法錯誤這個? – Timm

+0

你是否在不同的基於字符串的值周圍添加了強制的「引號」? –

+0

你有逃脫你的內容? –

1

使用MySQL's REPLACE syntax

確保ID是主鍵或唯一鍵,並在所有三個ID,名稱和已刪除列上創建索引。

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