2012-03-20 2 views
1

SQL 쿼리를 작성하여 모든 보류중인 이벤트를 검색하려고하지만 테이블 구성 방법이 어렵습니다.SQL 쿼리 문제가 발생했습니다.

event { 
event_id 
name 
group_id} 

Pending { 
GroupID 
UserID 
} 

Users{ 
Username 
UserID 
} 

이제까지 사용자가 사용자 ID로 식별하고, 그룹 ID로 그룹마다 다음과 같이

내 테이블입니다. 이벤트에는 사용자 목록을 가리키는 GroupID가 있습니다.

SELECT * FROM event 
WHERE event.group_id = (SELECT GroupID FROM Pending) 

하지만 어떻게 그런 다음 특정 사용자 ID를 가진 사용자 만 보류중인 이벤트가 반환됩니다 그래서이 연결 않습니다 그래서, 특정 사용자에 대한 모든 보류중인 이벤트를 검색 할 필요가?

select e.* from event e 
inner join pending p on 
e.group_id = p.GroupID 
where p.UserID = 123 

이를 작성하는 일반적인 방법은 inner join을 사용하고 있습니다 : 이미 사용자 ID가있는 경우

답변

4
select e.* from event e 
inner join pending p on 
e.group_id = p.GroupID 
inner join Users u 
on p.UserID = u.UserID 
where u.UserID = 123 

실제로는이 사용자 테이블에 가입 건너 뛸 수 있습니다. 전통적으로 하위 선택보다 성능이 좋았지 만 현대 DBMS는이를 동일한 쿼리로 최적화합니다. 당신이 정말로 하위로 작성하려는 경우 XYZ 어떤 정수 값이어야이

SELECT * FROM event 
WHERE event.group_id in (SELECT GroupID FROM Pending WHERE UserID = 123) 
+0

답장을 보내 주셔서 대단히 감사합니다. –

0
SELECT * FROM event E, 
       pending P, 
       Users U 
     WHERE E.group_id = P.GroupID 
      AND P.UserID = U.UserID 
      AND U.UserID = (Some XYZ id) 

처럼 입력을 선택합니다.

1

당신은 당신이 시도 할 수

SELECT u.username, 
     e.name 
FROM users u 
     INNER JOIN pending p 
     ON u.userid = p.userid 
     INNER JOIN event e 
     ON p.groupid = e.groupid 
WHERE 
    u.UserID = SomeID 
0

를 필터링 할 WHERE 절을 사용하지 않고 함께 테이블을 연결하는 JOIN 절을 사용하려면 :

select e.*, u.* from pending as p, users as u, event as e 
WHERE 
p.group_id = e.group_id 
AND p.user_id = u.userID 
1
SELECT 
    event.event_id 
FROM event 
    LEFT JOIN Pending ON event.group_id = Pending.GroupID 
    LEFT JOIN Users USING (UserID) 
WHERE Users.Username = 'foobar' 

USING()가 활용 될 수있을 때 선택 항목의 양쪽에있는 열은 같은 이름을 갖습니다. 그것은 쉽게 읽을 수 있습니다. 이것이 내가 데이터베이스 전체에서 동일한 데이터에 대해 동일한 이름을 사용하도록 권장하는 주된 이유 중 하나입니다. 예를 들어 Documents 테이블 및 기본 키 document_id 인 경우 문서의 ID를 참조하는 다른 모든 테이블에서 동일한 이름을 사용합니다.

JOIN에 대해 자세히 알아 보려면 mysql 또는 postgresql 링크를 참조하십시오. 그리고 각 참여의 시각적 표현은 this article입니다.

또한 원하는 RDBMS에 대한 책을 얻고 모든 기본 사항을 익히면 SQL Antipatterns 책을 읽어 지식을 확장 할 수 있습니다. 또는 책의 저자가 작성한 slides을 신중하게 살펴볼 수도 있습니다.

관련 문제