如何删除mysql中只有一个不同列的行?

时间:2013-05-20 18:38:22

标签: mysql duplicate-removal

我有一个表,对于某些行,除了一列之外,大多数列都是重复的。我想知道如何选择那些行,并根据一些要求只保留一行?这是我的表格:

+------+------+--------+---------+-----------+
| 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的行,然后比较匹配列。但我不确定在查询中如何做到这一点,我想知道是否有更好的方法来做到这一点。 我很感激您的意见。提前谢谢!

1 个答案:

答案 0 :(得分:0)

因为我遇到了一个类似的问题,有人帮助我。我可能过于复杂了:))

我认为a_id只有一个普通组的问题就是你无法区分已经分组的2个重复项,但仍有不同的匹配列值...

你刚刚得到;

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

您不想删除。您希望“匹配”列中的“名称”的副本对吗?

可能会将你的小组与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 = = name”,您应该获得要验证的所有副本的列表。
完整陈述应返回以下内容;

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

如果结果与您的目标相符,则可以将语句更改为删除。

添加了此fiddle