2010-04-18 99 views
2

查询是这样的:删除重复在MySQL

CREATE TABLE `query` (
`id` int(11) NOT NULL auto_increment, 
`searchquery` varchar(255) NOT NULL default '', 
`datetime` int(11) NOT NULL default '0', 
PRIMARY KEY (`id`) 
) ENGINE=MyISAM 

首先我想删除表:

ALTER TABLE `querynew` DROP `id` 

,然后删除重复输入.. 我试了一下:

INSERT INTO `querynew` SELECT DISTINCT * FROM `query` 

但没有成功.. :(

ALTER TABLE query ADD UNIQUE (searchquery) - 是否可以只保存一次查询?

回答

0

我会做这个使用索引与MySQL特定的IGNORE键ORD。这样一举两得:它会删除重复的行,并添加一个唯一的索引,这样就不会再有更多的索引。它通常比其他方法更快:

alter ignore table query add unique index(searchquery, datetime); 
+0

that one was great !!! very fast and干净!!!谢谢!! :-) – elmaso 2010-04-18 11:57:14

0

你应该能够做到这一点没有先删除列:

DELETE FROM `query` 
WHERE `id` IN (
     SELECT `id` 
      FROM `query` q 
     WHERE EXISTS (-- Any matching rows with a lower id? 
       SELECT * 
        FROM `query` 
       WHERE `searchquery` = q.`searchquery` 
        AND `datetime` = q.`datetime` 
        AND `id` < q.`id` 
       ) 
     ); 

您也可以通过一个临时表去:

SELECT MIN(`id`), `searchquery`, `datetime` 
    INTO `temp_query` 
GROUP BY `searchquery`, `datetime`; 

DELETE FROM `query`; 

INSERT INTO `query` SELECT * FROM `temp_query`; 
+0

没有成功,#1064 - 您的SQL语法错误;检查与您的MySQL服务器版本相对应的手册,以便在'q WHERE EXISTS(SELECT * FROM'query' WHERE'sea'at line 1 – elmaso 2010-04-18 01:31:46

+0

第二个给出此错误:#1327 - 未声明的变量:temp_query: (但是我创建了与temp_query相同的表.. – elmaso 2010-04-18 01:43:02

+0

D'oh!那个总是让我修复(我希望) – 2010-04-18 01:43:18

2

我会使用MySQL的多表删除的语法:

DELETE q2 FROM query q1 JOIN query q2 USING (searchquery, datetime) 
WHERE q1.id < q2.id; 
+0

谢谢,太棒了! – elmaso 2010-04-18 01:52:42