我有一个包含3列的表:id
,date
和name
。我要找的是删除名称重复的记录。规则应该是保留具有最早日期的记录。例如,在下面的示例中,有3条记录名为Paul。因此,我希望保留具有最早日期(id=1)
的日期并删除所有其他日期(id = 4 and 6)
。我知道如何进行插入,更新等查询,但在这里我不知道如何使这个技巧工作。
id, date, name
1, 2012-03-10, Paul
2, 2012-03-10, James
4, 2012-03-12, Paul
5, 2012-03-11, Ricardo
6, 2012-03-13, Paul
mysql_query(?);
答案 0 :(得分:1)
答案 1 :(得分:1)
我可以给你的最佳建议是在name
上创建一个独特的索引,避免一切麻烦。
按照Peter Kiss
中的步骤2至3进行操作。然后执行此操作
ALTER Table tablename ADD UNIQUE INDEX name (name)
然后关注4 Insert everything from the temporary table to the original
。
所有新的重复行都将被省略
答案 2 :(得分:1)
这样的事情会起作用:
DELETE FROM tablename WHERE id NOT IN (
SELECT tablename.id FROM (
SELECT MIN(date) as dateCol, name FROM tablename GROUP BY name /*select the minimum date and name, for each name*/
) as MyInnerQuery
INNER JOIN tablename on MyInnerQuery.dateCol = tablename.date
and MyInnerQuery.name = tablename.name /*select the id joined on the minimum date and the name*/
) /*Delete everything which isn't in the list of ids which are the minimum date fore each name*/
答案 3 :(得分:1)
喜欢马特,但没有加入:
DELETE FROM `table` WHERE `id` NOT IN (
SELECT `id` FROM (
SELECT `id` FROM `table` GROUP BY `name` ORDER BY `date`
) as A
)
如果没有第一个SELECT,您将获得“您无法在FROM子句中为更新指定目标表'表'”
答案 4 :(得分:0)
DELETE t
FROM tableX AS t
LEFT JOIN
( SELECT name
, MIN(date) AS first_date
FROM tableX
GROUP BY name
) AS grp
ON grp.name = t.name
AND grp.first_date = t.date
WHERE
grp.name IS NULL
答案 5 :(得分:0)
DELETE FROM thetable tt
WHERE EXISTS (
SELECT *
FROM thetable tx
WHERE tx.thename = tt.thename
AND tx.thedate > tt. thedate
);
(请注意,“date”是SQL中的保留字(类型),“和”在某些SQL实现中名称是保留字)