我有一个表,对于某些行,除了一列之外,大多数列都是重复的。我想知道如何选择那些行,并根据一些要求只保留一行?这是我的表格:
+------+------+--------+---------+-----------+
| 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 :(得分: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