2010-05-03 4 views
0

나는 한 테이블에 약 120,000,000 레코드가있는 매우 큰 데이터베이스를 가지고 있습니다.이 테이블의 데이터를 정리하기 전에 여러 테이블 아마도 그것을 정규화 할 것이다). 이 테이블의 열은 "id (Primary Key), userId, Url, Tag"입니다. 이것은 기본적으로 맛있는 웹 사이트의 데이터 집합의 하위 집합입니다. 내가 말했듯이, 각 행에는 id, userID url 및 "one"태그 만 있습니다. 예를 들어, 맛있는 웹 사이트의 북마크는 단일 URL에 대한 여러 태그로 구성됩니다. 이는 내 데이터베이스의 여러 줄에 해당합니다. 예 : "id"; "사용자", "URL", "태그" "38"; "12c2763095ec44e498f870ed67ee948d"; "http://forkjavascript.org/"; "AJAX" "39"; "12c2763095ec44e498f870ed67ee948d"; "http://forkjavascript.org/"; "API" "40"; "12c2763095ec44e498f870ed67ee948d ";"http://forkjavascript.org/ ","스크립트 " "41 ";"12c2763095ec44e498f870ed67ee948d ";"http://forkjavascript.org/ ";"라이브러리 " "42 ";"12c2763095ec44e498f870ed67ee948d ";"http://forkjavascript.org/ ","I보고 싶다면 레일 "mysql 데이터베이스의 열 개수를 기반으로 특정 행을 삭제합니다.

각 "별개의"URL에 대한 태그의 수는 아래 쿼리를 실행합니다.

URL

BY urltag 그룹에서 "TagCount" 로 DISTINCT URL, 태그, COUNT (태그)를 선택 이제 해당 URL과 관련된 5 개 미만의 태그가 기록을 삭제합니다. 누구나 실행해야하는 실제 쿼리를 알고 있습니까? 감사합니다.

답변

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

해야합니다. 하지만 귀하의 요청은 특별히 몇 가지 userIds가 동일한 URL을 제출할 수 있다는 사실을 고려하지 않았습니다.

+0

이 쿼리를 실행할 때 오류가 발생합니다. "FROM 절 – Hossein

+0

아에서 업데이트 할 대상 테이블 'urltag'을 지정할 수 없습니다.이 경우 mysql에서 수행 할 수 없을 수도 있습니다. 나는 ms-sql이이 경우를 다룰 수 있다고 생각한다. 당신의 유일한 옵션은 2 개의 쿼리에서 그것을 수행하고 카운트 (태그)가 5 인 뚜렷한 URL을 얻은 다음 해당 URL에서 쿼리를 삭제하는 것입니다. – oedo

+0

감사합니다. – Hossein

0

GROUP BY URL을 할 때 SELECT DISTICT url, ...이 필요하지 않습니다. 이 같은 쿼리를 다시 작성할 것 : 유용한 데이터를 제공하지 않습니다 select 절에 tag 열을 배치

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

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

에서. GROUP BY 절에 열이 언급되지 않은 경우 반환되는 값은 임의적으로 min (tag)입니다.

그래서 미만 5 개 태그 연관되어있는 URL을 포함하는 모든 행을 제거하려는 경우, 당신은이 수행 할 수 있습니다

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; 
할 수
관련 문제