Удаление Дубликатов в MySQL - PullRequest
2 голосов
/ 18 апреля 2010

Запрос был такой:

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 ) - возможно ли сохранить запросы только один раз?

Ответы [ 3 ]

2 голосов
/ 18 апреля 2010

Я бы использовал синтаксис удаления нескольких таблиц MySQL:

DELETE q2 FROM query q1 JOIN query q2 USING (searchquery, datetime)
WHERE q1.id < q2.id;
0 голосов
/ 18 апреля 2010

Я бы сделал это, используя индекс с ключевым словом IGNORE для MySQL. Это убивает двух зайцев одним выстрелом: удаляет дублирующиеся строки и добавляет уникальный индекс, чтобы вы больше не получали их. Обычно это быстрее, чем другие методы:

alter ignore table query add unique index(searchquery, datetime); 
0 голосов
/ 18 апреля 2010

Вы должны быть в состоянии сделать это без предварительного удаления столбца:

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`;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...