이 테이블이 있다고 가정 해 보겠습니다.중첩 쿼리가없는 SQL 쿼리
테이블 사용자 :
- ID
- username을
- 이메일
테이블 user2group :
- 사용자 ID
- 그룹 ID
테이블 그룹 :
- ID
- 그룹 이름
어떻게 모든 사용자를 반환 한 쿼리를 만들 수 있죠, 그리고 그룹은 그들에 속한다 (결과 집합 또는 무언가의 배열로 ..)
이 테이블이 있다고 가정 해 보겠습니다.중첩 쿼리가없는 SQL 쿼리
테이블 사용자 :
- ID
- username을
- 이메일
테이블 user2group :
- 사용자 ID
- 그룹 ID
테이블 그룹 :
- ID
- 그룹 이름
어떻게 모든 사용자를 반환 한 쿼리를 만들 수 있죠, 그리고 그룹은 그들에 속한다 (결과 집합 또는 무언가의 배열로 ..)
select u.id, u.username, u.email, g.groupid, g.groupname
from user u
join user2group ug on u.userid=ug.userid
join group g on g.groupid=ug.groupid
order by u.userid
당신이 결과 집합 통해 반복되기 때문에, 당신이 볼 때마다 새로운 사용자 ID는 새로운 사용자 객체 (또는 무엇이든)를 만들고 그것에 그룹을 추가합니다.
에릭의 대답은 훌륭하지만, 어떤 그룹에도 속하지 않은 사용자를 얻으려면 INNER 대신 LEFT JOIN을 사용합니다.
SELECT
u.id,
u.username,
u.email,
g.groupid,
g.groupname
FROM
user u
LEFT JOIN user2group ug ON u.userid = ug.userid
LEFT JOIN group g ON g.groupid = ug.groupid
ORDER BY
u.userid
위의 두 가지 모두 어느 정도 정확합니다 (각 사용자가 그룹을 갖고 있는지 여부에 관계없이). 그러나 그들은 또한 각 사용자에 대해 여러 항목이 포함 된 결과 세트를 제공합니다.
하나의 쉼표로 구분 된 문자열로 모든 그룹 구성원을 연결하는 방법이있다, 당신이 여기에 대해 읽어 좋을 것 : 제가 개인적으로 좋아하는 또 다른 방법은 관계형 테이블 user2group 대신 비트 값을 사용하는 것입니다 http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/
테이블 사용자는 int (또는 bigint) 필드 그룹을 가져오고 각 그룹 ID에는 하나의 비트 값이 할당됩니다 (예 : 1,2,4,8,16 등). 사용자 테이블의 그룹 필드 값 그런 다음 할당 된 groupID의 합계입니다. 그룹에 그룹이 있는지 조회하려면 여기서 (그룹 AND 그룹 ID = 그룹 ID)