문제

U.User, G.Group, U2G. 사용자, 그룹, U2G user.u = u2g.u 및 groups.g = u2g.g를 선택하십시오.

다음과 같이 데이터를 반환합니다.

user, group, something
----------------------
1   , 3,     a
1   , 5,     b
2   , 3,     c
3   , 3,     d
4   , 5,     e

이제이 쿼리가 사용자 만 표시하는 방식 으로이 쿼리를 제한하고 싶습니다. 둘 다 그룹 3과 5에서 - 내 예제 데이터에 대해 {1,3, a}, {1,5, b} 만 반환합니다.

편집 : 그룹을 사용하여 잘못된 솔루션이있을 수 있으므로 데이터에 다른 열을 추가했습니다.

EDIT2 : 죄송합니다. 문서로 오도되었습니다. MySQL 4.0은 하위 쿼리를 지원하지 않습니다.

EDIT3 :이 SQL은 여러 그룹에 대해 프로그래밍 방식으로 생성되므로 (현재 사양에서 최대 20 개) 너무 많은 추가 코딩을 제공하는 솔루션을 피하고 싶습니다. 솔루션을 찾지 못하면 결과 .NET 1.1 DataTable을 수정하지만 가능한 경우 피하고 싶습니다.

edit4 : 새로운 아이디어가 있습니까? 아마도 (3,5)를 포함하는 하위 쿼리가없는 것일까 요?

도움이 되었습니까?

해결책

Groups-Table과 Double Join을 사용하면 올바른 결과가 나옵니다.

  select u.user, u2g.something 
  from   users 
  INNER JOIN u2g ON users.u = u2g.u
  INNER JOIN groups g1 ON u2g.g = g1.g AND g1.group = 3
  INNER JOIN groups g2 ON u2g.g = g2.g AND g2.group = 5
  /* try this for two rows, one for each group */
  INNER JOIN groups ON u2g.g = groups.g

그러나 이것은 귀하의 요청과 정확히 일치하지 않으며 각 그룹마다 하나씩 두 개의 행을 원합니다. 이것은 당신에게 단 하나의 행만 줄 것입니다. 두 줄을 렌더링 할 수 있도록 그룹과 한 번 더 합류 할 수 있습니다.

또 다른 예제 (매핑과 동일한 groupID를 사용하여 선택하는 경우) :

SELECT u.uID, gm.something 
FROM cdcms_users u 
inner join cdcms_group_memberships gm1 on gm1.uID = u.uID AND gm1.gID = 32
inner join cdcms_group_memberships gm2 on gm2.uID = u.uID AND gm2.gID = 33

다른 팁

select u.user, g.group, u2g.something 
from users u, groups g, u2g 
where u.user = u2g.user and g.group = u2g.group 
    where exists 
     (select 1 
         from u2g u2g2 
        where u2g2.user=u.user and u2g2.group in(3,5))

이 라인을 따라 뭔가?

select u.[user], g.group
from     u
    inner join ug on ug.userid = u.id   
    inner join g on g.id = ug.groupid
    inner join 
    (
        select ug.userid
        from ug
        where ug.groupid in (1,2)
        group by ug.userid
        having count(*) = 2
    ) sub on sub.userid = u.id

-에디

Oracle에서 두 줄을 초래하는 상당히 끔찍한 비 일반 솔루션 :

  select users.u, groups.g
    from   users , groups, u2g, groups g2, u2g u2g2
    where  users.u = u2g.u 
           and users.u = u2g2.u
           and groups.g = u2g.g
           and g2.g = u2g2.g
           and (groups.g in (3,5) and g2.g in (3,5) and groups.g <> g2.g)
           ;

groups 쿼리에 사용 되었습니까? 액세스 된 필드 (g) 존재합니다 u2g. 나는 당신이 아마 거기에서 물건을 다시 가져오고 싶다고 생각합니다.

하위 쿼리를 사용하지 않고 설명한 결과 세트를 얻으려면 쿼리 텍스트의 2 차 폭발로 끝납니다!

다음 형식이 필요합니다.

select users.u, groups.g, u2g0.something
from users u, groups g, u2g u2g0, u2g u2g1
where groups.g = 3
     and users.u = u2g0.u
     and u2g0.g = 3
     and users.u = u2g1.u
     and u2g1.g = 5
union all
select users.u, groups.g, u2g1.something
from users u, groups g, u2g u2g0, u2g u2g1
where groups.g = 5
     and users.u = u2g0.u
     and u2g0.g = 3
     and users.u = u2g1.u
     and u2g1.g = 5

이것은 프로그래밍 방식으로 생성 된 쿼리이므로 쿼리 구성을 설명하기 위해 웹 페이지 스크립팅과 같은 표기법을 사용합니다. 또한 그룹 식별자가 잠재적 인 SQL 주입 공격 벡터가 아니라는 발진과 무의미한 단순화 가정을 만들 것입니다. :-)

<% for(int i = 0; i < requiredGroups.Length; i++) { %>
  <% if(i > 0) { %>
    union all
  <% } %>
select users.u, groups.g, u2g<%=i%>.something
from users u, groups g
  <% for(int j = 0; j < requiredGroups.Length; j++) { %>
     , u2g u2g<%=j%>
  <% } %>
where groups.g = <%=requiredGroups[i]%>
  <% for(int j = 0; j < requiredGroups.Length; j++) { %>
     and users.u = u2g<%=j%>.u
     and u2g<%=j>.g = <%=requiredGroups[j]%>
  <% } %>
<% } %>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top