我遇到有关mysql表更新的问题。我有包含5列的表,包括ID,NAME,TIMESTAMP和其他2列。我的问题是我想删除那些ID和NAME与另一行,s ID和NAME匹配的行,并保留最新的TIMESTAMP行。
我正在尝试以下查询,但它显示错误:
#1093 - 您无法在FROM子句
中为更新指定目标表'dummy1'
查询是:
delete from dummy1 where LAST_USED_DATE not in(
select max(LAST_USED_DATE) from dummy1
group by ID,NAME);
答案 0 :(得分:2)
尝试
DELETE d
FROM dummy1 d JOIN
(
SELECT d1.id, d1.name, MAX(d1.last_used_date) max_date
FROM dummy1 d1 JOIN dummy1 d2
ON d1.id = d2.id AND d1.name = d2.name
GROUP BY id, name
) q ON d.id = q.id AND d.name = q.name AND d.last_used_date <> q.max_date
这是 SQLFiddle 演示
更新要仅检查重复的ID,您可以稍微调整上述查询
DELETE d
FROM dummy1 d JOIN
(
SELECT d1.id, MAX(d1.last_used_date) max_date
FROM dummy1 d1 JOIN dummy1 d2
ON d1.id = d2.id
GROUP BY id
) q ON d.id = q.id AND d.last_used_date <> q.max_date
这是 SQLFiddle 演示
UPDATE2 删除带有最大时间戳
的dupes 1)您可以通过引入带IGNORE
选项的唯一索引。在这种情况下,MySql将决定自己保留哪些记录。
ALTER TABLE dummy1 ENGINE MyISAM;
ALTER IGNORE TABLE dummy1 ADD UNIQUE (id, name);
ALTER TABLE dummy1 ENGINE InnoDB;
答案 1 :(得分:1)
即使没有小提琴我也试一试。试试这个:
DELETE D1.* FROM DUMMY1 D1
JOIN (SELECT D.ID,D.NAME, MAX(LAST_USED_DATE) DATE FROM DUMMY1 D GROUP BY D.ID) D2 ON D1.ID = D2.D2
WHERE D1.NAME = D2.NAME AND D1.LAST_USED_DATE <> D2.DATE
由于您保留MAX(LAST_USED_DATE)