2013-07-17 2 views
2

나는 department 테이블과 user 테이블을 가지고 있으며 각각의 연관이 다른 부서에 있다는 것은 명백합니다.
각 부서의 모든 사용자를 개별적으로 원합니다. 그룹별로 또는 ... 또는 할 수 있습니까?두 테이블에서 데이터를 가져 오기위한 SQL 그룹 쿼리

내 시도는 나에게 원하는 결과를 제공하지 않습니다 다음과 같다 :

select username,b.deptName 
    from user a 
inner join dept b 
    on a.dept=deptId group by deptName 

PS : 나는하지 각 부서 별도의 질의에 대해 서로 다른 부서의 동료를 얻기 위해 하나 개의 SQL 쿼리를 필요로한다!


샘플 데이터

User(Table) 

username dept 

John  1 
Jack  2  
Sam  1 
Tedy  1 
Tom  2 
Sara  2 

dept:(Table) 
deptId deptName 
1  HR 
2  IT 

My Desired result: 
HR:John-Sam-Tedy 
IT:Jack-Tom-Sara 
+0

PLS는 일부 샘플 data.Your 질문이 이해하기 어렵 제공하려고? –

+0

몇 가지 샘플 출력을 제공 할 수 있습니까? – Nithesh

+0

당신은'Group by' 대신'Order by'을 원하십니까? – bummi

답변

5

단일 쿼리는 하나의 결과 집합이 아닌 별도의 결과 집합을 반환합니다.

쿼리의 GROUP BY는 많은 행을 제거합니다.

각 부서에 대해 단일 행이 필요한 경우 몇 가지 제한 사항이 있지만 GROUP_CONCAT 기능을 사용할 수 있습니다. (최대 길이가 max_allowed_packet에 의해 제한, 당신은 어떤 사용자 이름에 문자로 표시되지 않는 구분 기호를 사용할 필요가있다.

SELECT b.deptName 
    , GROUP_CONCAT(a.username ORDER BY a.username ASC SEPARATOR '-') AS usernames 
    FROM user a 
    JOIN dept b 
    ON a.dept=b.deptId 
GROUP BY b.deptName 

을 나는 당신이 GROUP_CONCAT에 의해 ORDER의 일종을 포함하는 것이 좋습니다 그 결과 너무 것이다 결정적이어야하며 실행마다 다를 수 없습니다.

보다 바람직한 출력은 각 사용자 이름에 대해 별도의 행이 될 수 있습니다. ORDER BY 절을 사용하여 서로 인접한 부서의 행을 가져올 수 있습니다. 실제로는 "분리"되어 있지만 행이 정렬됩니다.

SELECT b.deptName 
    , a.username 
    FROM user a 
    JOIN dept b 
    ON a.dept=b.deptId 
ORDER BY b.deptName, a.username 

Q : 문자의 수 또는 1메가바이트 같은 실제 크기에 따라 제한이 당신이 "의 max_allowed_packet"를 설명해 수있다 ...?

A :

GROUP_CONCAT() 함수에 의해 리턴 된 문자열 제한된 길이를 갖는다. 한계는 문자가 아닌 바이트로 지정되며, max_allowed_packet 세션 변수의 현재 값에서 파생됩니다. 예를 들어

:

SHOW VARIABLES LIKE 'max_allowed_packet'; 

Variable_name  Value  
------------------ --------- 
max_allowed_packet 1048576 

그래서이 GROUP_CONCAT에 의해 반환되는 문자열이 1메가바이트보다 더 할 수 있다는 것을 의미한다.

+0

정말 고마워요! 당신의 첫 번째 해결책은 제가 찾고있는 것 같습니다! 하지만 "max_allowed_packet"은 문자 수 또는 1MB와 같은 실제 크기를 기준으로 한 제한 사항이라고 설명 할 수 있습니까? 왜냐하면 제한이 내 경우에는 괜찮지 만 문자의 수는 실제 크기를 기반으로하기 때문에 –

+0

+1 좋은 대답 .. – Nithesh

+0

당신의 답변을 사랑했지만 예제의 사용자 이름 열이 제한을 초과 한 것 같습니다 그리고 그것은 내 데이터베이스에있는 모든 사용자 이름을 보여주지는 못한다 :(나는 한계를 높이려고했지만 성공하지는 않았다! –

0

결과로 STUFF을 사용해보세요. 이

SELECT D.department, 
    STUFF((
    SELECT '-'+ U1.userName 
    FROM user U1 inner join department D1 ON U1.dept_ID=D1.dept_ID 
    WHERE D1.deptName= D.deptName 
    FOR XML PATH('') 
    ) 
    ,1,0,'') AS users 
FROM user U inner join department D ON U.dept_ID=D.dept_ID 
GROUP BY D.deptName 
관련 문제