2013-09-29 24 views
0

我有一個像這樣的myqsl圖表:PRIMERY KEY(ID),名稱,值,日期如何刪除重複項是否正確?

如果「名稱和值和日期」與現有行相同,我需要刪除重複項。 我有一種解決方案,我之前發現和哪些工作(不是100%),但我不明白的命令,因爲我只進入基本的MySQL ...可以有人解釋我進一步..

definitly什麼是x在最後?

$delDups = "delete from chart where id not in (select * from (select min(id) from chart n group by value) x)"; 

mysql_query($delDups); 
+1

這是一個相當複雜的查詢,包含兩個子查詢。 x最後是最內層子查詢的別名,IIRC MySQL強制您在某些條件下爲子查詢提供別名,即使您不需要它們。 – TheWolf

+0

MySQL是否允許此查詢?當子查詢引用了你要刪除的同一個表時,我不認爲它允許'UPDATE'或'DELETE'使用'WHERE IN(subquery)'?我通常必須使用'LEFT JOIN'來重寫這樣的事情。 – Barmar

+0

好吧,已經...您知道如何更改查詢,以便如果名稱和值和日期等於一個正在發生的行以刪除重複? – 4M8B

回答

1

在我看來,你可以做到這一點簡單的,就像這樣:

$delDups = "delete from chart where id not in (select min(id) from chart n group by value)"; 

在你saing子查詢: 「嘿,把所有的值,並找到最低限度的ID值組「

因此,設想子查詢的結果作爲列表,如」(12,13,200)「。NOT IN運算符將採用該列表並使用它來過濾上層結果查詢並說「給我所有結果,少於id在此列表中的那些」

我不知道如果我解釋它如預期...

+0

不需要'n'別名。 – Barmar

+0

噢,這是真的! ;) –

1

您可以添加一個獨特的密鑰對所有3列:

ALTER IGNORE TABLE my_table 
ADD CONSTRAINT uc_unic UNIQUE (Name, Value, Date) 

至於是x,MySQL的許可別名,實質上名稱快捷方式以方便使用。

+0

我相信你只能在刪除重複項之後做到這一點,儘管它可能是OP模式的一個有用補充。 –

+0

不會在您添加它時刪除重複項。 – Mihai

+0

呵呵,我更喜歡Postgres的人,但是除非你在裏面放了一個'IGNORE'子句,否則MySQL不會抱怨? –

0

您所寫的內容幾乎可行,您只需將namedate添加到GROUP BY子句。像這樣的事情應該做。

DELETE FROM chart 
WHERE id NOT IN (
    SELECT MIN(id) 
    FROM chart 
    GROUP BY name, value, date) 

DELETE FROM表示您希望從表中刪除行。 WHERE子句說明您實際想要刪除的行(忽略它將刪除所有內容)。括號中的子查詢將查看每個組合name,valuedate,並從每個組合返回一個id。綜上所述,DELETE現在應該刪除每個組的id不是最小的每一行。

希望有幫助!