2010-05-03 111 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;