0

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

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

4

1 回答 1

0

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

我认为仅按 a_id 进行简单分组的问题在于,您无法区分已分组但具有不同匹配列值的 2 个重复项...

你会得到;

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

您不想删除。您想要“匹配”列中带有“名称”的重复项,对吗?

可能使用您的 group-by a_id 隔离 dups,然后进一步隔离结果以选择匹配字段中具有“名称”值的那些?

也许是这样的?

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'”,您应该获得所有要验证的 dup 的列表。
完整的语句应返回以下内容;

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

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

添加了这个小提琴

于 2013-05-20T19:26:25.037 回答