У меня есть таблица со следующими столбцами:
URL_ID
URL_ADDR
URL_Time
Я хочу удалить дубликаты в столбце URL_ADDR
, используя запрос MySQL.
Можно ли делать такую вещь без использования каких-либо программ?
У меня есть таблица со следующими столбцами:
URL_ID
URL_ADDR
URL_Time
Я хочу удалить дубликаты в столбце URL_ADDR
, используя запрос MySQL.
Можно ли делать такую вещь без использования каких-либо программ?
Рассмотрим следующий тестовый пример:
CREATE TABLE mytb (url_id int, url_addr varchar(100));
INSERT INTO mytb VALUES (1, 'www.google.com');
INSERT INTO mytb VALUES (2, 'www.microsoft.com');
INSERT INTO mytb VALUES (3, 'www.apple.com');
INSERT INTO mytb VALUES (4, 'www.google.com');
INSERT INTO mytb VALUES (5, 'www.cnn.com');
INSERT INTO mytb VALUES (6, 'www.apple.com');
Где теперь находится наша тестовая таблица:
SELECT * FROM mytb;
+--------+-------------------+
| url_id | url_addr |
+--------+-------------------+
| 1 | www.google.com |
| 2 | www.microsoft.com |
| 3 | www.apple.com |
| 4 | www.google.com |
| 5 | www.cnn.com |
| 6 | www.apple.com |
+--------+-------------------+
5 rows in set (0.00 sec)
Затем мы можем использовать синтаксис multiple-table DELETE
следующим образом:
DELETE t2
FROM mytb t1
JOIN mytb t2 ON (t2.url_addr = t1.url_addr AND t2.url_id > t1.url_id);
..., который удалит повторяющиеся записи, оставив только первый URL-адрес на основе url_id
:
SELECT * FROM mytb;
+--------+-------------------+
| url_id | url_addr |
+--------+-------------------+
| 1 | www.google.com |
| 2 | www.microsoft.com |
| 3 | www.apple.com |
| 5 | www.cnn.com |
+--------+-------------------+
3 rows in set (0.00 sec)
UPDATE. В дополнение к новым комментариям выше:
Если дублирующиеся URL-адреса не будут иметь одинаковый формат, вы можете применить функцию REPLACE()
, чтобы удалить www.
или http://
части. Например:
DELETE t2
FROM mytb t1
JOIN mytb t2 ON (REPLACE(t2.url_addr, 'www.', '') =
REPLACE(t1.url_addr, 'www.', '') AND
t2.url_id > t1.url_id);
Вы можете попробовать метод, упомянутый в http://labs.creativecommons.org/2010/01/12/removing-duplicate-rows-in-mysql/.
ALTER IGNORE TABLE your_table ADD UNIQUE INDEX `tmp_index` (URL_ADDR);
Это приведет к тому, что с URL_ID
DELETE FROM table
WHERE URL_ID NOT IN
(SELECT ID FROM
(SELECT MAX(URL_ID) AS ID
FROM table
WHERE URL_ID IS NOT NULL
GROUP BY URL_ADDR ) X) /*Sounds like you would need to GROUP BY a
calculated form - e.g. using REPLACE to
strip out www see Daniel answer*/
(Полученная таблица "X" соответствует избегать ошибки. Вы не можете указать таблицу табуляции 'tablename' для обновления в предложении FROM)
Ну, вы всегда можете:
INSERT INTO ... SELECT DISTINCT
в таблицу temp из исходной таблицы;INSERT INTO ... SELECT
в исходную таблицу из таблицы tempЭто неуклюже и неудобно и требует нескольких запросов (не говоря уже о привилегиях), но это будет трюк, если вы не найдете другого решения.
Даниэль Вассалло Как сделать несколько столбцов?
DELETE t2 FROM directory1 t1 JOIN directory1 t2 ON (t2.page = t1.page, t2.parentTopic = t1.parentTopic, t2.title= t1.title, t2.description = t1.description, t2.linktype = t1.linktype, t2.priority = t1.priority AND t2.linkID > t1.linkID);
может быть так?
Вы можете группировать по URL_ADDR, который будет эффективно давать вам только определенные значения в поле URL_ADDR.
select
URL_ID
URL_ADDR
URL_Time
from
some_table
group by
URL_ADDR
Наслаждайтесь!
Это будет работать при условии, что столбец URL_ID уникален.
DELETE FROM url WHERE URL_ID IN (
SELECT URL_ID
FROM url a INNER JOIN (
SELECT URL_ADDR, MAX(URL_ID) MaxURLId
FROM url
GROUP BY URL_ADDR
HAVING COUNT(*) > 1) b ON a.URL_ID <> b.MaxURLId AND a.URL_ADDR = b.URL_ADDR
)