使用MySQL删除表中的某些重复记录

时间:2011-03-03 00:42:17

标签: mysql phpmyadmin

我有一张桌子可以比较美国航空公司的竞争力。因此,表中的一些字段是id,route_id1,route_id2,airline_id1,airline_id2,sources_airport_id和destination_airport_id。 此表是自行加入包含路由映射的路由表的结果。 但结果是,该表有一些重复的记录。

例如,
路由1与route2竞争,因为它们具有相同的source_airport和destination_airport,但具有不同的airline_id。但我有两条记录比较route1到route2和route2到route1。它们是相同的比较,但只是以不同的方式排序。

我试图通过自我加入来获取重复项:
选择t1。* 从路径AS t1,路线AS t2 在哪里t1.route_id1 = t2.route_id2 AND t1.route_id2 = t2.route_id1
但是这个查询只能获得表中相同数量的记录。

如何摆脱“重复”数据?

提前致谢。

3 个答案:

答案 0 :(得分:1)

问题是您没有条件将t1t2分开。首先,您将获得交换t1t2的重复项。其次,如果任何行都有route_id1 = route_id2,那么您也会在结果集的t1t2中获得这些行。

解决这个问题的最简单方法是:

SELECT t1.* FROM routes AS t1, routes AS t2 
WHERE t1.route_id1 = t2.route_id2 AND t1.route_id2 = t2.route_id1
      AND t2.id > t1.id

添加的标准是一行的id必须大于另一行。这意味着返回的t1将始终是id较低的行。你当然可以用<或者交换参数以获得具有较高id的行。

这将消除大部分重复。如果数据库中也有正确的重复项,那么将在上述查询的结果集中创建一些重复的行。原因是“复制”可能被检测为两个不同对应行的“复制”,而这两个行又是实际重复的。

答案 1 :(得分:0)

select中的

使用字段的实际名称并使用DISTINCT子句而不是使用t1。*。 在字段列表中,请确保您不包含airline_id,因为它们不同,它们会使您的记录不重复。

答案 2 :(得分:0)

您是否尝试过使用“SELECT DISTINCT t1.* FROM ...”?