2013-10-02 113 views
-1

我想通过删除表中的重复项来清理我的表,但保留重复记录的最新版本。如何删除表中的重复记录,但保留最新?

我的表格与下面的表格类似。我想删除flightNo“AF 8253”副本,但在14:20时将航班号“AF 8253”的到达时间保留。

id depOrArriv flightNo airline dest origin depature arrivalTime status 
183 Arrival AF 8253 AirUganda NULL Nairobi NULL  14:05  Scheduled 
184 Arrival AF 8253 AirUganda NULL Nairobi NULL  14:20  Scheduled 
185 Arrival SCAN09 SCAN Air NULL Kampala NULL  10:30  Scheduled 

我试过下面的代码,但它似乎并没有工作。

$sql = "CREATE TEMPORARY TABLE schedule_temp AS 
       SELECT DISTINCT * FROM sortedArrivals 
       DELETE FROM sortedArrivals 
       INSERT INTO sortedArrivals( 
       timePeriod, depOrArriv, flightNo, airline, dest, 
       origin, depature, don, arrivalTime, status) 
       SELECT timePeriod, depOrArriv, flightNo, airline, 
       dest, origin, depature, don, arrivalTime, status 
       FROM schedule_temp"; 

if (!$mysqli->query($sql)) 
    { 
    die('Error: ' . $mysqli->error); 

    } 

任何人都可以帮助指向正确的方向吗? 期待您的回音。

+0

不在约SQL什么?并且您没有在示例中列出您的重复航班。 – OIS

+0

“似乎不起作用”?它似乎*从头到尾都是乱码! – Strawberry

回答

1

你可以试试这个,假设改期航班总是有更高的ROWID比前一个,你可以通过具有相同flightNo航空公司产地标识重复 (你也可以多变量组中的其他情况下添加BY子句):

DELETE FROM sortedArrivals 
WHERE RowId NOT IN 
(SELECT MAX(RowId) FROM sortedArrivals GROUP BY flightNo, airline, origin); 
+0

美观而合乎逻辑的解决方案。非常感谢你,你的代码帮助解决了这个问题。 – SirBT

0
DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(flightNo VARCHAR(12) NOT NULL 
,arrivalTime TIME NOT NULL 
,PRIMARY KEY (flightno,arrivaltime) 
); 
INSERT INTO my_table VALUES 
('AF 8253','14:05'),   
('AF 8253','14:20'), 
('SCAN09','10:30'); 

SELECT * FROM my_table; 
+----------+-------------+ 
| flightNo | arrivalTime | 
+----------+-------------+ 
| AF 8253 | 14:05:00 | 
| AF 8253 | 14:20:00 | 
| SCAN09 | 10:30:00 | 
+----------+-------------+ 


    DELETE a 
    FROM my_table a 
    LEFT 
    JOIN 
     (SELECT x.* 
      FROM my_table x 
      JOIN 
       (SELECT flightno 
        , MAX(arrivaltime) max_arrivaltime 
        FROM my_table 
       GROUP BY flightno 
      ) y 
      ON y.flightno = x.flightno 
      AND y.max_arrivaltime = x.arrivaltime 
     ) b 
     ON b.flightno = a.flightno 
    AND b.arrivaltime = a.arrivaltime 
    WHERE b.flightno IS NULL; 

SELECT * FROM my_table; 
+----------+-------------+ 
| flightNo | arrivalTime | 
+----------+-------------+ 
| AF 8253 | 14:20:00 | 
| SCAN09 | 10:30:00 | 
+----------+-------------+ 
+0

我试过了你的解决方案,但没有得到它的工作。在你的查询中,X,a和b是什么?请详细说明。 – SirBT

+0

我的表格和你的表格在每个相关的细节中看起来都是相同的,所以我不明白为什么它不起作用。 x,a和b都是表别名。顺便说一句,接受的解决方案绝对不是美丽! ;-) – Strawberry

+0

对不起,X,A和B很混乱。如果我将它复制并粘贴到我的MySQL查询中,它会起作用吗?谢谢。 – SirBT

1

这里有一个SQL小提琴: http://sqlfiddle.com/#!2/a7e36/1

create table flight (id varchar(100), arrivalTime varchar(100)); 
insert into flight values ('8253','14:05'); 
insert into flight values ('8253','14:20'); 
insert into flight values ('8254','15:05'); 
insert into flight values ('8254','15:20'); 

DELETE FROM flight 
WHERE not exists (
SELECT * FROM 
(SELECT f2.ID 
     , MAX(f2.arrivalTime) arrivalTime 
    FROM flight f2 
GROUP BY f2.ID) x 
WHERE x.ID = flight.ID and x.arrivalTime = flight.arrivalTime 
); 

SELECT * from flight; 

输出:

ID  ARRIVALTIME 
8253 14:20 
8254 15:20