MYSQL удалить все результаты, имеющие количество (*) = 1 - PullRequest
7 голосов
/ 14 декабря 2009

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

Пример:

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

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

Ответы [ 3 ]

9 голосов
/ 14 декабря 2009
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

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

См. Эту статью в моем блоге для более подробной информации:

1 голос
/ 14 декабря 2009

Или, если вы используете более старую (до 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, которая содержит историю всех удаленных вами строк. Вы можете использовать это для архивирования, трендов, других забавных и необычных вещей, чтобы удивить себя.

1 голос
/ 14 декабря 2009

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

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

РЕДАКТИРОВАТЬ: Благодаря комментарию @Quassnoi ниже ... Вышеуказанное будет НЕ работать в MySql, поскольку MySql ограничивает ссылки на обновляемую или удаляемую таблицу в подзапросе i Вы должны сделать то же самое, используя Join ...

...