2009-12-14 3 views
7

У меня есть таблица с двумя полями sesskey (varchar32, index) и продуктами (int11), теперь мне нужно удалить все строки, содержащие группу по счету sesskey (*), = 1. Я пытаюсь несколько методов, но все не удается.MYSQL удалить все результаты, имеющие счетчик (*) = 1

Пример:

delete from taged where sesskey in (select sesskey from taged group by sesskey having count(*) = 1) 

Поле sesskey не может быть первичным ключом, поскольку его повторили.

ответ

9
DELETE si 
FROM t_session si 
JOIN (
     SELECT sesskey 
     FROM t_session so 
     GROUP BY 
       sesskey 
     HAVING COUNT(*) = 1 
     ) q 
ON  q.sesskey = si.sesskey 

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

Смотрите эту статью в своем блоге более подробно:

+0

по какой-то причине это не сработало для меня в последней версии mysql. Мне пришлось использовать этот пример из вашего блога (LEFT JOIN, ID NULL). Мне также удалось удалить неправильные строки: p (должен был использовать IS NOT NULL для моего случая) – Spikolynn

1

Подзапрос должен работать

Delete from taged 
    Where sesskey in 
    (Select sesskey 
     From taged 
     Group by sesskey 
     Having count(*) = 1) 

EDIT: Благодаря @Quassnoi комментарий ниже ... выше будет НЕ работу в MySql, так как MySql ограничивает ссылки на таблицу обновляется или удаляется из подзапроса i, вы должны делать то же самое с помощью ...

+0

не будет работать (+15 символов) – Quassnoi

+0

# 1093 - Вы не можете указать целевую таблицу 'TAged' для update в FROM FROM – Alex

+0

Эта ошибка запутанна ... Там нет «обновления» ... Что это значит? Использование tablename в предложении Delet? или использование tablename в подзапросе (которое не является ни обновлением, ни удалением чего-либо). –

1

Или, если вы используете старше (до 4,1) версии MySQL и не имеет доступ к подзапросам вам нужно выбрать данные в таблицу, а затем присоединиться к этой таблице с оригиналом:

CREATE TABLE delete_me_table (sesskey varchar32, cur_total int); 

INSERT INTO delete_me_table SELECT sesskey, count(*) as cur_total FROM orig_table 
WHERE cur_total = 1 GROUP BY sesskey; 

DELETE FROM orig_table INNER JOIN delete_me_table USING (sesskey); 

Теперь у вас есть таблица с именем осталось delete_me_table который содержит историю всех удаленных строк. Вы можете использовать это для архивирования, трендов, других интересных и необычных вещей, чтобы удивить себя.

Смежные вопросы