2016-03-05 130 views
3

我有一個包含兩個外鍵的表。我需要刪除key1的所有行,其中key2是key2,但val < $ x。MySQL:根據最大值刪除記錄

key1 & key2不是不同的值;可以有多個具有相同key1和/或key1/key2對的記錄。

我嘗試了幾種方法,但無法獲得任何工作。到目前爲止,每種方法都會導致MySQL錯誤(例如「無法重新打開表格」)或錯誤的結果。從表中

的樣本數據:

rownum key1 key2 val col col2 col3 col4 
1  123  1  2  a  b  c  d 
2  123  1  2  e  f  g  h 
3  123  2  3  i  j  k  l 
4  123  2  3  m  n  o  p 
5  456  1  1  q  r  s  t 

我需要刪除所有行「VAL」爲<最高的「VAL」對於任何給定KEY1/KEY2對。

換句話說,對於每個不同的key1/key2組合,我需要找到最大值「val」($ x),並刪除VAL爲< $ x的行。

因此,delete語句後所需的輸出是:

rownum key1 key2 val col col2 col3 col4 
3  123  2  3  i  j  k  l 
4  123  2  3  m  n  o  p 
5  456  1  1  q  r  s  t  

(COL-COL4在決定刪除哪些記錄無關,我包括他們唯一要注意的是,表中包含其他列)

key1,key2和「val」都是int類型。

如何刪除key1 & key2相同的行,但val < $ x?

+0

向我們展示您嘗試過的查詢。 –

+2

對於'key1 = 123'和'key2 = 2'的組合,val的最高值爲3.因此,在兩種情況下'key2'小於3,那麼爲什麼組合不會被刪除? –

+0

對不起,該文章(現已編輯)出現錯誤。我的意思是說: 「我需要刪除'val'對於任何給定的key1/key2對'最高'val'的所有行。」 – fournines

回答

1

我不知道你的主鍵是什麼,所以我只是把它稱爲primary_key

首先,我們需要找到KEY2的最大值爲每key1的

SELECT key1 as fk1, max(key2) as max_key2 from table group by key1 

然後所有行其中KEY2 < max_key2

SELECT t.primary_key as id, s.fk1, s.max_key2, t.key1 from table as t, (SELECT key1 as fk1, max(key2) as max_key2 from table group by key1) as s WHERE t.key2 < s.max_key2 AND s.fk1 = t.key1 

然後刪除這些行

DELETE from table where primary_key in (SELECT id from (SELECT t.primary_key as id, s.fk1, s.max_key2, t.key1 from table as t, (SELECT key1 as fk1, max(key2) as max_key2 from table group by key1) as s WHERE t.key2 < s.max_key2 AND s.fk1 = t.key1)) 

我還沒有測試過這個,但這大概是我如何去解決這個問題。

這不用說,但驗證您刪除並具有備份

2

之前,使用一個多表刪除您使用的重點領域加入表上本身的語法:

DELETE t1 FROM table1 t1, table1 t2 
WHERE t1.key1=t2.key1 AND t1.key2=t2.key2 AND t1.val < t2.val 

Sqlfiddle - 我修改了樣本數據以使密鑰對具有不同的值。