2012-03-09 69 views
4

我想建立一个mysql查询来列出所有列a有一个重复列b从一个表。诀窍是我有行上的时间戳,所以我需要基本上确定哪些是较旧的重复项,所以我可以删除它。任何帮助,将不胜感激。mysql查询根据时间戳识别和删除重复项

+0

后一些示例数据,...,N笏ü甲肝试过.. – Teja 2012-03-09 18:55:51

+0

SELECT *, COUNT(foocode)AS NUMOccurrences FROM表 GROUP BY foocode HAVING(COUNT(foocode)> 1)ORDER BY foolastmodified ASC – 2012-03-09 18:58:11

+0

我对mysql没有太大的支持,在这一点上......显然没有工作我甚至无法看到重复的记录,只是向我展示了专栏和发生的次数,并按时间顺序排列整个事情ps如果我是正确的?我希望它显示重复记录,按列分组,按时间戳排序,然后最终有能力删除旧的副本 – 2012-03-09 18:59:51

回答

3

只是例子 - 该查询返回重复的帖子,现在你只需要执行删除

id| title  | text_desc   | created 
------------------------------------------------------- 
1 | The title | description here |2012-02-21 10:58:58 
2 | The title | description here 1 |2012-02-21 10:58:58 
3 | The title | description here 3 |2012-02-21 10:58:58 

    select bad_rows.* 
    from posts as bad_rows 
     inner join (
     select title, MIN(id) as min_id 
      from posts 
      group by title 
      having count(*) > 1 
     ) as good_rows on good_rows.title = bad_rows.title 
      and good_rows.min_id <> bad_rows.id; 

这里是返回行

id| title  | text_desc   | created 
------------------------------------------------------- 
2 | The title | description here 1 |2012-02-21 10:58:58 
3 | The title | description here 3 |2012-02-21 10:58:58 
+0

感谢您添加视觉示例,使其易于遵循 – 2012-03-09 20:13:01

0
SELECT FOOCODE,COUNT(*) AS DUPS 
FROM TABLE 
GROUP BY FOOCODE 
HAVING COUNT(FOOCODE)>1; 

上面的查询将返回ü所有的重复。这是你在找什么?

+0

嗯,这会给我的列和计数的出现正确吗?可以说有些事情发生了3次......我需要确定老的事件,所以我可以删除它们并保留最新的一个。 – 2012-03-09 19:06:04

+0

所以你有一个时间戳列存在每个dup ...?你可以复制你的数据ñ发布它... – Teja 2012-03-09 19:07:18

+0

我有一个时间戳。数据将沿着列a == fooprodcode,列b == foodescription,列c == foosku,列d == footimestamp的行显示。这有帮助吗?所以可以说我们有一个重复的SKU。我需要识别重复的sku,为此重复的sku组中的时间戳排序,并确定哪个是最新的时间戳记,以便我可以删除该重复组中较旧的所有记录? Idk,如果我解释得很好。让我知道 – 2012-03-09 19:15:49

3

这是你的查询:

DELETE FROM tablename 
WHERE id IN 
(SELECT t1.id 
FROM tablename t1 
JOIN tablename t2 
    ON t2.cola = t1.cola AND t2.colb = t1.colb 
    AND t2.timecol > t1.timecol 
WHERE t1.cola = t1.colb) 

的SELECT语句返回那里cola = colb并有与稍后的日期等匹配的行记录。 DELETE语句删除SELECT返回的所有记录。

如果你正在寻找去除重复cola,那么这是查询:

DELETE FROM tablename 
WHERE id IN 
(SELECT t1.id 
FROM tablename t1 
JOIN tablename t2 
    ON t2.cola = t1.cola 
    AND t2.timecol > t1.timecol) 
+1

如果OP确实需要colA = colB,这看起来像他/她正在寻找的答案。 – RumpRanger 2012-03-09 19:19:30

+0

谢谢你的两个查询,我需要花更多的时间研究子查询 – 2012-03-09 20:14:09

+0

我的表名是general2,所以当我运行命令时,我得到这个错误:“你不能指定目标表'general2'在FROM子句中更新”任何建议? – 2015-07-07 13:18:09