2009-06-04 3 views
1

여기 까다로운 것이 있습니다.쉼표로 구분 된 필드가있는 MySQL 그룹화

 
User ID Name  Skill Sets 
1  Jim  Install, Configure 
2  Jack  Install 
3  John  Configure, Setup, Blah 
4  Bill  Setup, Install 

이 내 디자인하지 않고, 그 데이터를 포맷하는 방법을 변경할 수있는 옵션이 아니다 : 다음과 같이

나는 데이터를 가지고있다. 문제는 고유 한 기술 세트별로 그룹화해야한다는 것입니다. 물론 지금에 의해 그룹은 내게 제공 :

 
Skill Set    Count 
Install, Configure  1 
Install     1 
Configure, Setup, Blah 1 
Setup, Install   1 

원하는 출력은 다음과 같습니다

 
Skill Set Count 
Install  3 
Configure 2 
Setup  2 
Blah   1 

어떤 아이디어? 스킬 세트를 정규화 된 형식으로 분리하는 뷰를 만들 수 있습니다. 그러나 나는 그 중 하나의 구문에 대해서도 긍정적이지 않다.

+0

가능한 기술 집합이 잘 정의되어 있습니까? 아니면 "기술 집합 필드의 아무 곳에 나 나타나는 모든 항목"으로 이동해야합니까? – balpha

+0

기술은 별도의 테이블에 정의되어 있습니다. 그들은 단지 적절한 관계형 테이블을 사용하는 대신 문자열을 연결하기로 선택했습니다. 물론 변경된 스킬 이름에 오타가 있었기 때문에 데이터가 엿 같았습니다. 나는 "Install"과 "Instla"를 별도의 그룹으로 받아 들일 수 있습니다. –

답변

7

기술의 가능한 모든 값을 포함하는 행 집합이 있어야합니다.

MySQL에는 할 수있는 방법이 없으므로 어떻게 든 생성해야합니다. 이 같은 결과 집합이있는 경우

, 단지 문제 : 그러나 것이다

SELECT skill, COUNT(*) 
FROM skills s 
JOIN users u 
ON  find_in_set(s.skill, u.sets) 
GROUP BY 
     s.skill 

이를 : 당신은 당신이 표를 사용하여 별도의 테이블에있는 당신의 능력을 가지고 있음을 언급 한 이후

SELECT skill, COUNT(*) 
FROM (
     SELECT 'Install' AS skill 
     UNION ALL 
     SELECT 'Configure' AS skill 
     UNION ALL 
     SELECT 'Setup' AS skill 
     UNION ALL 
     SELECT 'Blah' AS skill 
     ) s 
JOIN users u 
ON  find_in_set(s.skill, u.sets) 
GROUP BY 
     s.skill 

오타와 일치하지 않는, 그들은 그냥 건너 뛸 것입니다.

+0

언뜻보기에 각 스킬의 사용자 수와는 달리 각 사용자의 스킬 수를 알 수 있습니다. 아직도, 개념은 동일하다 (나는 생각한다). 나는 이것을 줄 것이다. –

+0

@epalla : 예, 맞습니다. 업데이트 중입니다. – Quassnoi

+1

위대한 작품, 감사합니다 Quassnoi! "find_in_set"은 나를위한 누락 된 링크였습니다. –

관련 문제