2009-07-10 2 views
2

의 당신은 세 개의 테이블과 같은 구성, 항목, 이벤트 및 시트 이름이 있다고 가정 해 봅시다 :MySQL을 사용하여 세 번째 테이블과의 관계를 기반으로 두 테이블을 조인 할 수 있습니까?

항목
아이디 (INT)
EVENT_ID (int)를
제 (int)를

이벤트
아이디 (INT)
Venue_id (int)를
구성 (INT)

좌석
아이디 (INT)
Venue_id (int)를
구성 (int)를
제 (int)를
Face_value (int)를

나는를 구축하기 위해 노력하고있어 Item 테이블에서 모든 항목을 가져오고 각 항목의 Face Value를 포함하는 MySQL 쿼리. 이를 위해,해야하는 쿼리

  1. 가 이벤트 테이블에서 해당 항목에 대해 Event.Id
  2. 에 Item.Event_id 값을 사용하고 일치, 그것은 Event.Venue_id 및 이벤트를 취해야합니다. 구성 및 두 테이블에 동일한 값을 가진 항목 테이블에서 항목을 찾으려면 Item.Section과 같은 섹션에 대해 동일한 값을가집니다. 그런 다음 Face_value를 반환해야합니다.

세 가지 테이블의 정보를 결합하는 방식 때문에이 작업을 수행하는 데 많은 어려움이 있습니다. 그것에 접근하는 방법에 대한 아이디어? 아니면 SQL로 불가능합니까?

답변

4
SELECT `Item`.*, `Seat`.`Face_value` 
FROM `Item` 
JOIN `Event` ON `Event`.`Id` = `Item`.`Event_id` 
JOIN `Seat` USING (`Venue_id`, `Configuration`) 
WHERE `Seat`.`Section` = `Item`.`Section` 
+0

감사 톤 :-)이 구문을 선호합니다. 나는 왜 이것이 작동하는지 이해하려고 노력하고 있습니다 - 나는 JOIN의 순서가 중요하다고 가정합니다. mysql은 USING 명령어가 Seat과 Event 테이블에있는 동일하게 명명 된 변수를 참조한다는 것을 알고 있습니까? – Jack7890

+0

다소 중요합니다. USING은 JOIN의 양쪽에 동일한 이름의 C 럼이 있어야합니다. 하지만 쿼리를 다른 순서로 다시 작성할 수는 있지만 Adam Bernier의 설명에 따르면 USING은 편의를위한 것입니다. 방금 나에게 직관적 인 방식으로 썼습니다. – chaos

+0

놀라운 혼란! 나는 방금 MySQL을 배우기 시작했고 방금 한 일을하려하지만 머리 또는 꼬리를 만들 수 없습니다. 나는 아직 완전히 JOIN을 이해하지 못한다. :-) – enchance

1
chaos과 동일

,하지만 난

select s.Section, s.Configuration, s.Face_value 
from Item i 
     inner join Event e 
     on e.id = i.Event_id 
     inner join Seat s 
     on s.Venue_id = e.Venue_id 
    and 
     s.Configuration = e.Configuration 
    and 
     s.Section = i.Section 
+0

감사합니다. 이것과 혼돈의 대답의 가장 큰 차이점은 JOIN 대신 INNER JOIN을 사용하고 WHERE 절에서 "ON"절로 "s.Section = i.Section"부분을 이동한다는 것입니다. 이러한 변경 중 하나가 성능을 저하 시키거나 향상시킬 수 있습니까? – Jack7890

+0

한정자없이 JOIN을 작성할 때 INNER JOIN이 기본값이므로 실제로 차이가 없습니다. 둘 다 내부 조인을 사용하고 있습니다. 나는 WHERE vs. ON이 성능에 영향을 미칠 것이라고 생각하지 않는다. 그러나 불가능할 수는 없다. 두 가지를 모두 실행하는 것이 좋습니다. :) (어쩌면 그것들을 EXPLAINing하는 것입니다.) – chaos

+0

그것을 포함하는 것이 더 빨리 달릴 것 같습니다. 흥미 롭 군. – Jack7890

관련 문제