Php 如何从表中删除重复记录,但保留最新记录?

Php 如何从表中删除重复记录,但保留最新记录?,php,mysql,Php,Mysql,我想通过删除表中的重复项来清理表,但保留重复记录的最新版本 我的桌子看起来和下面那张相似。我想删除flightNo AF 8253的副本,但将flightNo AF 8253的到达时间保留在14:20 id depOrArriv flightNo airline dest origin depature arrivalTime status 183 Arrival AF 8253 AirUganda NULL Nairobi NULL 14:05

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

我的桌子看起来和下面那张相似。我想删除flightNo AF 8253的副本,但将flightNo AF 8253的到达时间保留在14:20

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);

  }
有人能帮我指出正确的方向吗?
期待您的回复。

您可以尝试一下,假设重新安排的航班的RowID始终高于前一航班,并且您可以通过使用相同的航班号、航空公司和始发地来识别重复航班。在其他情况下,您还可以向GROUP by子句添加更多变量:

 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    |
 +----------+-------------+
DELETE FROM sortedArrivals 
WHERE RowId NOT IN 
(SELECT MAX(RowId) FROM sortedArrivals GROUP BY flightNo, airline, origin);
下面是一个SQL小提琴:

输出:

ID      ARRIVALTIME
8253    14:20
8254    15:20

你对SQL一无所知吗?你没有在示例中列出你的重复航班。似乎不起作用???这似乎自始至终都是胡言乱语!我试过你的解决办法,但没能奏效。你的查询中的X、a和b是怎么回事?请详细说明。我的桌子和你的桌子在每个相关细节上都是一样的,所以我不明白为什么它不起作用。x、 a、b和b都是表别名。顺便说一句,公认的解决方案绝对不漂亮-对不起,X、A和B混淆了。如果我复制并粘贴到MySQL查询中,它会工作吗?谢谢。漂亮而合理的解决方案。非常感谢,您的代码帮助解决了这个问题。
ID      ARRIVALTIME
8253    14:20
8254    15:20