2013-05-20 38 views
0

我有一張表,其中一些行的大部分列都是重複的,除了一列以外。我想知道如何選擇這些行,並根據某些要求只保留一行?下面是我有表:如何刪除mysql中只有一個不同列的行?

+------+------+--------+---------+-----------+ 
| a_id | b_id | a_name | b_name | matching | 
+------+------+--------+---------+-----------+ 
| 001 | 123 | AAA | BBB | ID  | 
+------+------+--------+---------+-----------+ 
| 002 | 456 | CCC | CCC | ID  | 
+------+------+--------+---------+-----------+ 
| 002 | 456 | CCC | CCC | Name | 
+------+------+--------+---------+-----------+ 

的要求是,對於相同的A_ID,如果有兩個匹配的ID和匹配的名字,我想匹配名稱中刪除行。匹配的ID由另一個表確定,所以我們不必擔心這一點。所以上表所需的輸出爲:

+------+------+--------+---------+-----------+ 
| a_id | b_id | a_name | b_name | matching | 
+------+------+--------+---------+-----------+ 
| 001 | 123 | AAA | BBB | ID  | 
+------+------+--------+---------+-----------+ 
| 002 | 456 | CCC | CCC | ID  | 
+------+------+--------+---------+-----------+ 

我對MySql並不是很熟悉。我正在考慮使用if語句來首先篩選出具有相同a_id的行,然後比較匹配的列。但我不確定在查詢中如何做到這一點,我想知道是否有更好的方法來做到這一點。 我會感激你的投入。提前致謝!

+0

只匹配列應該改變嗎? – hjpotter92

+0

不,我通過運行查詢兩個表並查找mathing ID和匹配名稱的查詢來獲取此表。問題是它們中的一些重疊(即,具有匹配ID的項目也具有匹配的名稱) – pew007

+0

您能否給我們架構? – Achrome

回答

0

因爲我有一個類似的問題,有人幫助我的刺。雖然我可能會過度複雜化:)

我認爲a_id只是一個普通的組的問題是,你不能區分2個重複已被分組,但仍然有不同的匹配列值...

你剛剛得到;

+------+------+--------+---------+-----------+ 
| a_id | b_id | a_name | b_name | matching | 
+------+------+--------+---------+-----------+ 
| 002 | 456 | CCC | CCC | ID  | 
+------+------+--------+---------+-----------+ 

你不想刪除。你想要在「匹配」列中有'姓名'的二人組合嗎?

可能將dups與您的組隔開(通過a_id),但將隔離結果進一步選擇具有匹配字段中的「name」值的那些結果?

也許像這樣?

SELECT * from MyTable alias1 
inner join (select a_id from MyTable where matching = 'name') alias2 
on alias1.a_id = alias2.a_id 
where matching = 'name' 

如果你忽略了「where matching ='name'」,你應該得到一個所有dups的列表來驗證。
完整的聲明應返回以下內容;

+------+------+--------+---------+-----------+ 
| a_id | b_id | a_name | b_name | matching | 
+------+------+--------+---------+-----------+ 
| 002 | 456 | CCC | CCC | name | 
+------+------+--------+---------+-----------+ 

如果結果與您的目標相符,則可以更改要刪除的語句。

加了這個fiddle

相關問題