Помогите с SQL запросом

12
f0x
На сайте с 20.09.2006
Offline
116
f0x
1022

Друзья.

Помогите пожалуйста решить задачу.

Есть следующая таблица (ниже) с количеством записей около 2 000 000, ее нужно почистить удалив одинаковые значения по полям id и uid, из всех одинаковых записей должна остаться только одна с самым большим pos. Как это можно сделать ?

Заранее большое спасибо за подсказку.

Оригинал:

+-----+-----+-----+---------------------+

| pos | id | uid | data |

+-----+-----+-----+---------------------+

| 334 | 518 | 100 | 2010-02-12 23:05:35 |

| 333 | 533 | 518 | 2010-02-10 12:53:38 |

| 331 | 518 | 249 | 2010-01-31 16:31:58 |

| 330 | 518 | 249 | 2010-01-31 16:06:40 |

| 329 | 518 | 149 | 2010-01-28 17:45:49 |

| 328 | 518 | 149 | 2010-01-28 17:45:35 |

| 327 | 518 | 149 | 2010-01-28 17:44:42 |

После чистки, должно быть так:

+-----+-----+-----+---------------------+

| pos | id | uid | data |

+-----+-----+-----+---------------------+

| 334 | 518 | 100 | 2010-02-12 23:05:35 |

| 333 | 533 | 518 | 2010-02-10 12:53:38 |

| 331 | 518 | 249 | 2010-01-31 16:31:58 |

| 329 | 518 | 149 | 2010-01-28 17:45:49 |

frantic
На сайте с 09.02.2009
Offline
27
#1

не понял, почему после очистки остались одинаковые id

SG
На сайте с 22.04.2008
Offline
32
SAG
#2

delete from table where not in (запрос на выборку нужных данных)

Чето типа такого, наверн...

Портфолио (http://beastman.me). Верстаю (/ru/forum/228498). Програмлю (/ru/forum/348359). Последние отзывы (/ru/forum/470865). Контакты: ICQ: 31377144пять;E-mail: andrschwartz<собако>gmail.com
frantic
На сайте с 09.02.2009
Offline
27
#3
SAG:
delete from table where not in (запрос на выборку нужных данных)
Чето типа такого, наверн...

да, delete from однозначно будет :)

ixRock
На сайте с 14.11.2006
Offline
46
#4

1й запрос: получаем строки какие НЕ надо удалять - SELECT MAX(pos) as `pos` FROM `1` GROUP BY id, uid

2й запрос: формируем список из первого запроса и вставляем id-шники через запятую в запрос:

DELETE FROM `1` WHERE `pos` NOT IN( тут_список_через_запятую )

примерно так )

Работаю [S]за еду и секас[/S] с XHTML, CSS, XSLT, JS, PHP. Если что, вот тут (http://www.mintdesign.ru/) некоторые мои работы. Контакты: ася 344-ноль86-276, мыло ixrock@gmail.com
SG
На сайте с 22.04.2008
Offline
32
SAG
#5

Ну, я к тому, что, если тс знает, как получить то, что ему надо оставить, будет чето типа такого. Вы ж сами написали, что непонятны условия, мож хоть тс понимает :)

SP
На сайте с 20.05.2008
Offline
56
#6

Если вся таблица построена по принципу, как указано в примере, то должны сработать такие строки:

ALTER IGNORE TABLE test  ADD UNIQUE INDEX  newindex  (id, uid)  ; 

ALTER TABLE test DROP INDEX newindex;

Перед пробой сделайте резервную копию таблицы.

Если же не во всей таблице pos уменьшается (как в примере), то добавить первой строчку ALTER TABLE test ORDER BY pos DESC; (в следующем моем сообщении указал полный код)

Делаю небольшие заказы на php, perl, js/ajax, delphi; парсеры, простые сайты с админкой, установка\настройка sape, wordpress и др. Мой Блог (http://www.seoproger.ru)
frantic
На сайте с 09.02.2009
Offline
27
#7
ixRock:
1й запрос: получаем строки какие НЕ надо удалять - SELECT MAX(pos) as `pos` FROM `1` GROUP BY id, uid

ну во первых оно даже сгруппируется неправильно

frantic добавил 23.02.2010 в 23:47

SeoProger:

ALTER IGNORE TABLE test  ADD UNIQUE INDEX  newindex  (id, uid)  ; 

ALTER TABLE test DROP INDEX newindex;

а с максимальным айди как быть? какие строки уник оставит?

ixRock
На сайте с 14.11.2006
Offline
46
#8
frantic:
ну во первых оно даже сгруппируется неправильно

с чего это вдруг неправильно? я у себя локально проверял, группирует как надо, но вот вложенный запрос просто не хавает, поэтому на два разбил. так что не надо тут воду мутить 🙅

frantic
На сайте с 09.02.2009
Offline
27
#9
ixRock:
с чего это вдруг неправильно? я у себя локально проверял, группирует как надо, но вот вложенный запрос просто не хавает, поэтому на два разбил. так что не надо тут воду мутить 🙅

мда подождем пока тс уточнит каков должен быть результат

SP
На сайте с 20.05.2008
Offline
56
#10
frantic:
а с максимальным айди как быть? какие строки уник оставит?

оставит те, которые первыми встретит, т.е. если в таблице уменьшающееся pos, как в примере, то все сработает верно.

А если нет, то тогда полная версия, которая в любом случае должна сработать:

ALTER TABLE test ORDER BY pos DESC;

ALTER IGNORE TABLE test ADD UNIQUE INDEX newindex (id, uid);
ALTER TABLE test DROP INDEX newindex;
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий