2013-10-02 153 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