2013-05-08 54 views
8

我有一個表,看起來像這樣:結合兩個查詢來檢查MySQL中的重複?

Number | Name 
--------+-------- 
123  | Robert 

這就是我想做的事:

如果號碼是已經在數據庫中,不要插入新記錄。

如果Number不在數據庫中,但名稱是,請創建一個新名稱並插入它。因此,舉例來說,如果我有一個包含123NumberBobName的紀錄,我不想把它插入,但如果我得到一個包含456NumberRobertname的記錄,我會插入456Robert1 。我打算檢查單獨的重複項,如:

SELECT * FROM Person where Number = 123; 

//If number is not found 
SELECT * FROM Person where Name = 'Robert'; 

//If name is found, add a number to it. 

有沒有辦法可以將兩個語句結合起來?

回答

9

你的問題其實有兩個問題。第一個問題是使Number列唯一,並且第二個問題是通過追加一個數字(如果它已經存在)來增加列Name

第一部分

由於數量是UNIQUE,執行在列一UNIQUE約束。它可能是PRIMARY KEYUNIQUE KEY

如果列沒有KEY,你想讓它PRIMARY,這裏是ALTER聲明:

ALTER TABLE TableName ADD CONSTRAINT tb_pk PRIMARY KEY (Number) 

,但如果你只希望它是UNIQUE和不是主鍵,

ALTER TABLE TableName ADD CONSTRAINT tb_uq UNIQUE (Number) 

第二部分

,而無需使用連接實際上,你可以做到這一點。

INSERT INTO TableName(Number, Name) 
SELECT 124 AS Number, 
     CONCAT('Robert', COALESCE(MAX(CAST(REPLACE(Name, 'Robert', '0') AS UNSIGNED)) + 1,'')) AS Name 
FROM TableName 
WHERE Name LIKE 'Robert%' 

一些細節:

Number已經存在列提供的值,因爲該列就會拋出一個錯誤獨特。我已閱讀了刪除帖子中的評論:「..Number不是唯一的,但如果確實存在,我不想輸入記錄。」 - 如果您不想在列上添加唯一性,則沒有任何意義。你怎麼知道這個號碼是否已經存在?對Number的存在做一點檢查對我來說感覺像是一個小小的開銷。所以我最好的建議是強制執行唯一性。

+1

@ J.W。至少給我們**一些時間**來思考:P,因爲你的回答非常完美,我們無法想出任何其他更好的答案。在之間讓我連接你** FB ** :) – Luv 2013-05-12 16:37:56

+0

當我插入'羅伯特'而不是'羅伯特',您的查詢結果錯誤:'數據截斷:截斷不正確INTEGER值:'0t'',而羅伯是新的名稱和有效。 – ahoo 2013-05-12 20:48:11

+0

第二部分真的很神奇:) +1 – fthiella 2013-05-12 20:48:12

1
SELECT * FROM Person WHERE Number = 123 OR Name = 'Robert' 

我還沒有與SQL工作了一段時間,所以這可能是錯誤的;)

編輯:

$number = 123; 
$name = 'Robert'; 
$query = mysql_query("SELECT * FROM Person WHERE Number = $number OR Name = '$name' "); 

if (mysql_num_rows($query) == 0) { 
//-> Add your record, it's unused 
} else if (mysql_result($query, 0, 'number') == $number && mysql_result($query, 0, 'name' == $name)) { 
//combination of number and name already exists -> modify name and add record 
} else { 
echo "Number is used by another name"; 
} 
+0

有沒有辦法只返回它,如果只有數字不存在,基本上我不想做一個OR,但我仍然想要獲得名稱,即使該數字不存在,所以如果我做了一個像SELECT * FROM Person WHERE Number = 123 AND Name ='Bob''這樣的查詢,這將不會返回任何結果,但我不想要這樣的結果,我想仍然使用Name返回一條記錄。 – Xaisoft 2013-05-08 20:23:26

+0

我認爲這是你想要的。$ number = 123; $ name ='Robert'; $ query = mysql_query(「SELECT * FROM Person WHERE Number = $ number OR Name ='$ name'」); if(mysql_num_rows($ query)== 0){ // - >添加你的記錄,它是未使用的 } else if(mysql_result($ query,0,'number')== $ number && mysql_result( $ query,0,'name'== $ name)){ //數字和名稱的組合已經存在 - >修改名稱並添加記錄 } else { echo「Number is used by another name」; } } – 2013-05-08 20:48:54

1

使用此查詢,用於插入該行[123, 'Robert']。如果你想插入其他值,在下面的查詢更改123 & Robert值:

insert into Person (Number,Name) 
select 123, IF(mn.MaxNumber is NULL,'Robert',concat('Robert',mn.MaxNumber+1)) 
from (SELECT 'foo') foo 
left JOIN (select max(CONVERT(SUBSTR(Name,LENGTH('Robert')+1),UNSIGNED)) `MaxNumber` 
      from person where name rlike '^Robert[0-9]*$') mn on 1=1 
where Not Exists (select * from Person where Number=123) 

:如果存在於表Robert,上述查詢插入Robert1。如果存在Robert1,則會插入Robert2,依此類推。

+0

*「我認爲我的回答是最好的,所以我給了我自己的賞金。」* - 刪除了你的答案。你有沒有想過表演? – 2013-05-19 01:26:16

+0

@JW웃,我的答案適用於我們不希望對列實施'UNIQUE'約束的情況。因爲Questionx @ Xaisoft並沒有提到'UNIQUE'約束。 – ahoo 2013-05-19 23:58:01

1

使數字和名稱都是唯一的。

ALTER TABLE `person` ADD UNIQUE (`number` ,`name`); 

你現在可以做一個插入與對重複

INSERT INTO `person` (`number`, `name`, `id`) VALUES ('322', 'robert', 'NULL')  ON DUPLICATE KEY UPDATE `id`='NULL'; 

對於名字我會建議使用自動增量列,而不是後附加一個數字。

0
insert into Person (Number,Name) 
select 123, IF(mn.MaxNumber is NULL,'Robert',concat('Robert',mn.MaxNumber+1)) 
from (SELECT 'foo') foo 
left JOIN (select max(CONVERT(SUBSTR(Name,LENGTH('Robert')+1),UNSIGNED)) `MaxNumber` 
      from person where name rlike '^Robert[0-9]*$') mn on true 
where Not Exists (select * from Person where Number=123)