Вопрос по SQL, очень срочно, помогите пожалуйста! Запорол таблицу, нужно фиксить

Spear

почемучка
Вопрос по SQL, очень срочно, помогите пожалуйста! Запорол таблицу, нужно фиксить

Здравствуйте,
у меня очень большая пробле, незнаю как её решить.
Вообщем есть таблица такого плана:

CAT_ID | OBJ_ID | STATUS

используется для привязки обектов к категориям.
но проблема такого плдана:

один объект может быть в оной категории только один раз.
а я случайно сделал запросы, которые расставили примерно такие значения:
1, 10, 0
1, 10, 1

2, 10, 0
2, 10, 1

и так длаее, то есть я в каждую категорию привязал два раза один и тот же объект под разными статусами, теперь не знаю как это пофиксить, так чтобы оперативно - это уже рабочий скрипт на сайт :(:(:(

Но нужно почистить так, что бы удалился только дупликат со статусом НОЛЬ.

Ещё одно дополнение - не все объекты "попртились", то есть есть и нормальные, вида:

1, 11, 0
1, 12, 1
1, 14, 1
1, 15, 0

и так далее.
Очень прошу, подскажите как мне сделать из
1, 10, 0
1, 10, 1

2, 10, 0
2, 10, 1

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

1, 10, 1

2, 10, 1

Я БУДУ ОЧЕНЬ ОЧЕНЬ бюлагодарен, особенно за оперативность - скрипт уже в сети, отключить нельзя.. точнее можно но крайне нежелательно.
 

svetasmirnova

маленький монстрик
Да ничего страшного на самом деле нет.
Вложенные подзапросы используемая версия базы поддерживает?
 

Spear

почемучка
да.
Но записей в этой, испоченной таблице, 2 тысячи.
Вложенные подзапросы в таком кол-ве не повесят базу?

пс
и всеравно ,честное слово - не соображаю как это сделать :( пожалуйста, помогите!
 

mani13

Новичок
1. выбрать cat_id, obj_id, для которых существует 2 status(см. group by)
2. для выбранного удалить ненужное
 

Spear

почемучка
mani13
спасибо, огромное спасибо что обратили внимание на то, что это срочно :(
по мануалам я всегда могу полазитЬ, блин, народ - ну помогите же, пожалуйста!
 

svetasmirnova

маленький монстрик
Spear
У тебя ключ из двух полей?

-~{}~ 28.01.06 23:46:

уникальный ключ имеется в виду
 

.des.

Поставил пиво кому надо ;-)
Spear операция разовая не мудрите в поисках красивого решения. Напишите скрипт 10 минут и удалите все дубликаты.

Алгоритм простой и вам его уже подсказал mani13

SELECT obj_id, COUNT(*) cnt FROM table GROUP BY obj_id HAVING COUNT(*)>1;

для всех выбранных объектов удаляете все где статус 0 с LIMIT cnt-1

если же у вас есть дубликаты типа
2, 10, 1
2, 10, 1
То алгоритм сами поправите, так как это форум, где помогают самим решать задачи, а не делают за Вас вашу работу.

-~{}~ 28.01.06 22:50:

А на будущее поставьте уникальный индекс на cat_id, obj_id
 

Spear

почемучка
.des.
спасибо, сейчас буду делать.
Только не совсем понятно:

>для всех выбранных объектов удаляете с LIMIT cnt-1
 

.des.

Поставил пиво кому надо ;-)
Код:
"DELETE FROM table 
WHERE obj_id=".$row['obj_id']." AND status=0 
LIMIT ".($row['cnt']-1);
 

Spear

почемучка
удалилсь все со статусом 0 :(

хорош что сделал бекап таблицы.

-~{}~ 29.01.06 00:10:

епрст неполучается :((
 

svetasmirnova

маленький монстрик
ёпрст, сначала на тестовой таблице пробовать надо было.

У меня база вложенные подзапросы не поддерживает. Вот вариант, который выбирает только дубликаты. Потом скриптом по результату пройтись. (delete where cat_id=res1 and obj_id=res2 and status=0)
[sql]
select CAT_ID, OBJ_ID from table group by CAT_ID, OBJ_ID having count(CAT_ID ) > 1 and count(OBJ_ID )>1;
[/sql]
 

Spear

почемучка
svetasmirnova
отлично, спасибо большое! получилось все сделать ! :)
БОООООООЛЬШОЕ СПАСИБО!
Жаль, нету на форуме репутации :)
 
Сверху