2010-05-03 80 views
0

我有一个非常大的数据库,其中一个表中有大约120万条记录。我已经清理了表中的数据,然后将其分成几个表(可能正常化它)。该表的列如下所示:“id(主键),userId,Url,Tag”。这基本上是美味网站数据集的一个子集。正如我所说的,每一行都有一个id,userID一个url和唯一的“一个”标签。例如,美味网站中的书签由单个网址的多个标签组成,这对应于我的数据库的多行。例如: “id”; “用户”, “URL”, “标签” “38”; “12c2763095ec44e498f870ed67ee948d”; “http://forkjavascript.org/ ”“ AJAX” “39”; “12c2763095ec44e498f870ed67ee948d”; “http://forkjavascript.org/ ”“ API” “40”;“12c2763095ec44e498f870ed67ee948d “;” http://forkjavascript.org/ “” JavaScript的 “ ”41“, ”12c2763095ec44e498f870ed67ee948d“;” http://forkjavascript.org/ “;” 图书馆 “ ”42“, ”12c2763095ec44e498f870ed67ee948d“;” http://forkjavascript.org/ “;” 轨道”根据mysql数据库中列的数量删除某些行

如果我想看每个“不同”网址的标签数量我运行下面的查询。

SELECT DISTINCT网址,标签,COUNT(标签)为 “TagCount” FROM urltag GROUP BY网址

现在我想删除与他们相关的网址不到5个标记的记录。 有谁知道我必须运行的实际查询? 谢谢

回答

0
delete from urltag where url in (SELECT DISTINCT url FROM urltag GROUP BY url HAVING count(tag) < 5) 

应该这样做。但您的请求没有特别考虑到几个不同的用户ID可能已经提交了相同的url ...

+0

运行此查询时出现错误: “您无法在FROM子句 – Hossein 2010-05-03 15:41:32

+0

中指定目标表'urltag'进行更新,在这种情况下,您可能无法在mysql中执行此操作。我认为ms-sql可以处理这种情况。我想你唯一的选择就是在2个查询中完成它,然后获取count(tag)<5的不同url,然后在这些urls上删除查询。 – oedo 2010-05-03 18:23:06

+0

感谢您的信息 – Hossein 2010-05-03 20:59:39

0

您不需要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 

SELECT子句中放置tag列将不提供有用的数据。如果在GROUP BY子句中未提及某列,则为其返回的值将是随机的,最后是min(标记)。

所以,如果你想删除包含其不到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;