Php 如何从表中删除重复记录,但保留最新记录?
我想通过删除表中的重复项来清理表,但保留重复记录的最新版本 我的桌子看起来和下面那张相似。我想删除flightNo AF 8253的副本,但将flightNo AF 8253的到达时间保留在14:20Php 如何从表中删除重复记录,但保留最新记录?,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
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