Удаление определенных строк на основе количества столбцов в базе данных mysql - PullRequest
0 голосов
/ 03 мая 2010

У меня очень большая база данных с примерно 120 миллионами записей в одной таблице. Сначала я очистил данные в этой таблице, прежде чем разделить их на несколько таблиц (возможно, нормализуя). Столбцы этой таблицы выглядят следующим образом: «id (первичный ключ), userId, Url, Tag». Это в основном подмножество набора данных с вкусного сайта. Как я уже сказал, каждая строка имеет идентификатор, идентификатор пользователя, URL-адрес и только один тег. Так, например, закладка на вкусном веб-сайте состоит из нескольких тегов для одного URL, что соответствует нескольким строкам моей базы данных. например: "Я бы"; "пользователь"; "URL"; "тег" "38"; "12c2763095ec44e498f870ed67ee948d"; "http://forkjavascript.org/";"ajax" "39"; "12c2763095ec44e498f870ed67ee948d"; "http://forkjavascript.org/";"api" "40"; "12c2763095ec44e498f870ed67ee948d"; "http://forkjavascript.org/";"javascript" "41"; "12c2763095ec44e498f870ed67ee948d"; "http://forkjavascript.org/";"library" "42"; "12c2763095ec44e498f870ed67ee948d"; "http://forkjavascript.org/";"rails"

Если я хочу увидеть количество тегов для каждого «отдельного» URL, я запускаю следующий запрос.

ВЫБЕРИТЕ DISTINCT url, tag, COUNT (tag) как «TagCount» ОТ urltag GROUP BY url

Теперь я хочу удалить записи, которые имеют менее 5 тегов, связанных с их URL-адресами. Кто-нибудь знает фактический запрос, который я должен выполнить? спасибо

Ответы [ 2 ]

0 голосов
/ 06 мая 2010

Вам не нужен SELECT DISTICT url, ... когда вы делаете GROUP BY url. Я бы переписал ваш запрос так: от

SELECT DISTINCT url,tag,COUNT(tag) as "TagCount" FROM urltag GROUP BY url

до

SELECT url, COUNT(tag) as "TagCount" FROM urltag GROUP BY url

Размещение столбца tag в предложении select не даст полезных данных. Если столбец не упоминается в предложении GROUP BY, значения, возвращаемые для него, будут случайными, обычно min (tag).

Итак, если вы хотите удалить все строки, содержащие URL-адреса, для которых было связано менее 5 тегов, вы можете сделать это:

Вы можете добавить флаг к вашей таблице, например:

alter table urltag 
    add column todelete tinyint(4) not null default 0,
    add key(todelete);

Тогда вы можете сделать

update urltag u 
inner join (
    SELECT url, count(tag) tagcount 
    FROM urltag GROUP BY url
    )big on big.url = t.url
set t.todelete = 1
where big.tagcount < 5;

Тогда просто

delete from urltag where todelete = 1;
0 голосов
/ 03 мая 2010
delete from urltag where url in (SELECT DISTINCT url FROM urltag GROUP BY url HAVING count(tag) < 5)

должен это сделать. но в вашем запросе не учтено, что несколько разных идентификаторов могли отправлять один и тот же URL ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...