2013-03-28 47 views
5

我有這樣一個表:MySQL的 - 如果空存在超過一個特定的NUM更多刪除行

id | name1 | name2 | name3
 1 | asa | NULL | das
 2 | NULL | NULL | asas

我想刪除一個有兩個或更多的時間NULL值(每行這裏,id = 2)
我已經做了一個小的PHP腳本,但我不知道這是否可以與MySQL查詢

我是新來的MySQL,所以我沒有嘗試任何東西呢!

+0

諷刺的是,這個問題是一個重複:P http://stackoverflow.com/questions/2630440/how-to-delete-duplicates-on-mysql-table –

+1

@BenjaminGruenbaum我不同意 - 鏈接的問題問如何刪除重複,而這個問題是關於刪除符合特定條件的非重複行(這裏:至少三列中的兩個是NULL) –

+0

@FrankSchmitt我沒有說它是一個確切的重複,但它是非常密切相關的海事組織。有效點。 –

回答

4

你將要使用多個過濾器WHERE條款,每一個檢驗是列null

delete 
from yourtable 
where 
    (name1 is null and name2 is null) or 
    (name1 is null and name3 is null) or 
    (name2 is null and name3 is null) or 
    (name1 is null and name2 is null and name3 is null) 

SQL Fiddle with Demo

+0

+1只是因爲 – Kermit

1
delete from table where 
    (name1 is null AND name2 is null) OR 
    (name2 is null AND name3 is null) OR 
    (name1 is null AND name3 is null) OR 
    (name1 is null AND name2 is null AND name3 is null) 
+0

這與@ bluefeet♦ –

+0

提供的答案完全相同而且您會注意到我在3分鐘前發佈了它。 – ajspacemanspiff

+0

我想知道爲什麼其他職位的薪水超過你的? –

1

您可以使用IS NULL取得布林( 0或1),對這些結果求和並刪除總和大於或等於2的行。

像這樣:

delete from your_table 
where ((name1 is null) + (name2 is null) + (name3 is null)) >= 2 
+0

+1因爲不同B-) –

0

相關,如果您需要刪除ALL列爲空的行,您可以這樣做。

該過程將刪除所有空值列的任何行,忽略可設置爲ID的主列。

DELIMITER // 
CREATE PROCEDURE DeleteRowsAllColNull(IN tbl VARCHAR(64)) 
BEGIN 
SET @tbl = tbl; 
SET SESSION group_concat_max_len = 1000000; 
SELECT CONCAT('DELETE FROM `',@tbl,'` WHERE ',(REPLACE(group_concat(concat('`',COLUMN_NAME, '` is NULL')),',',' AND ')),';') FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = @tbl AND COLUMN_KEY NOT LIKE 'PRI' into @delete_all; 
PREPARE delete_all FROM @delete_all; 
EXECUTE delete_all; 
DEALLOCATE PREPARE delete_all; 
END // 
DELIMITER ; 

執行這樣的程序。

CALL DeleteRowsAllColNull('your table'); 
相關問題