2014-01-25 4 views
0

SELECT 문을 만들려고하는데 실제로 수행하는 방법을 잘 모르겠습니다.SQL 복잡한 select 문

나는 2 개의 테이블 usergroup을 가지고 있습니다. 각 사용자는 userid이고 각 그룹에는 그룹을 소유 한 사용자를 지정하는 ownerid이 있습니다. 각 그룹에는 name이 있고 사용자 테이블 안에는 그 사람이 속한 그룹을 지정하는 group 열이 있습니다. (성가신 구조를 변명해라, 나는 그것을 만들지 않았다). group에있는 모든 행을 찾으려고합니다. 그 그룹의 에 group (사용자 테이블 내부)이 해당 그룹의 name으로 설정되어 있지 않습니다. 이 도움이 경우

사용자

|-----------------------| 
| id | username | group | 
|----|----------|-------| 
| 0 | Steve | night | 
| 1 | Sally | night | 
| 2 | Susan | sun | 
| 3 | David | xray | 
|-----------------------| 

그룹

|---------------------| 
| ownerid | name  | 
|---------|-----------| 
| 1  | night  | 
| 3  | bravo  | 
| 2  | sun  | 
|---------------------| 

을 브라보의 소유자가 자신의 그룹이 브라보로 설정하지 않기 때문에 SQL 문은 bravo의 그룹 행을 반환 경우 .

+0

bash는 SQL 문에서 어디에 있습니까? –

답변

1

이것은 원래 테이블과 다음 값의 비교에 다시 조인 :

select g.* 
from group g join 
    user u 
    on g.ownerid = id 
where g.name <> u.group; 

값이 NULL 될 수 있다면, 논리 계정에 그것을 가지고해야합니다.

SELECT g.* 
    FROM `Group` g 
    LEFT 
    JOIN `User` u 
    ON u.group = g.name 
    AND u.id = g.ownerid 
    WHERE u.id IS NULL 

이의 조금 것을 풀어 보자 :는 안티 조인

+0

그 트릭을하는 것처럼 보였지만, MySQL Workbench가 출력 행이 읽기 전용이라고 말하고 있습니다. (그룹에 이름 g를 할당하는 것과 관련이 있다고 가정하고 있습니까?)이 문제를 해결할 방법이 있습니까? – user2249516

+0

@ user2249516 . . MySQL 워크 벤치에서 출력이 읽기 전용이라고 말하는 이유에 대해서는 잘 모르겠습니다. 하나의 이유는 테이블에 기본 키가 부족하기 때문입니다. 'group'은 프라이 머리 키를 가지고 있습니까? –

+0

그래, 그렇지.출력을 복사하고 배열로 변환 한 다음 왜 읽었는지 결코 알 수 없기 때문에 출력을 복사해야했습니다. 도움을 주셔서 감사합니다, 정말로 감사드립니다. – user2249516

0
SELECT G.* 
FROM Group AS G 
WHERE G.Name NOT IN (SELECT DISTINCT U.Group FROM User AS U) 
1

익숙한 패턴이다. 그룹에서 모든 행을 반환하는 것으로 시작하겠습니다. 그런 다음 Group의 각 행을 User의 행과 "일치"시킵니다. '일치'로 간주 되려면 User.idGroup.ownerid과 일치해야하고 User.group 값은 Group.name과 일치해야합니다.

"트릭"은 일치 항목 (WHERE 절이하는 것)을 찾은 모든 행을 제거하여 일치 항목이없는 Group의 행만 남겨 둡니다.

하지 않은을 사용하여 상응하는 결과를 얻기 위해 또 다른 방법이있다

SELECT g.* 
    FROM `Group` g 
WHERE NOT EXISTS 
     (SELECT 1 
      FROM `User` u 
      WHERE u.group = g.name 
      AND u.id = g.ownerid 
     ) 

는 상관 서브 쿼리 술어를 사용 EXISTS; 일반적으로 조인만큼 빨리 수행되지 않습니다.

사용자 테이블에없는 ownerid 값을 가진 그룹에있는 행이 있으면 Gordon Linoff의 쿼리와 약간 다른 결과를 반환 할 가능성이 있습니다.