2017-01-03 2 views
0

누군가가 내게 도움이되기를 바랍니다.SQL 내부 조인 문이 원하는 결과를 제공하지 않음

Table: locations 
location_id user_id  city  state 
1    1    Los Angeles CA 
2    1    New York NY 
3    1    Chicago  IL 
4    2    Dallas  TX 
5    3    Denver  CO 
6    4    Miami  FL 
7    5    Atlanta  GA 

Table: events 
event_id user_id  event_name event_date 
1   1   My Event 1 2017-02-01 
2   2   My Event 2 2017-03-01 
3   3   My Event 3 2017-04-01 
4   4   My Event 4 2017-05-01 
5   5   My Event 5 2017-06-01 

나는 다음과 같은 쿼리를 실행하고 있습니다 :

SELECT e.event_id, e.user_id, e.event_name, e.event_date, 
     l.user_id, l.city, l.state 
FROM events e 
INNER JOIN locations l 
ON e.user_id = l.user_id 
ORDER BY e.event_date ASC 

내가 이벤트 테이블에 바로 기록을 얻기 위해 단지 시도하고, 그러나 또한 해당 도시와 상태를 끌어 나는 다음과 같은 두 개의 테이블이 두 표가 공통으로 가지고있는 user_id와 일치하는 출력은 다음과 같아야합니다.

event_id user_id  event_name event_date city   state 
1   1   My Event 1 2017-02-01 Los Angeles CA 
2   2   My Event 2 2017-03-01 Dallas  TX 
3   3   My Event 3 2017-04-01 Denver  CO 
4   4   My Event 4 2017-05-01 Miami   FL 
5   5   My Event 5 2017-06-01 Atlanta  GA 

누구든지 SQL에서 내 오류를 지적 할 수 있습니까?

+1

user_id = 1의 위치는 어느 것입니까? 왜 LA에서 결과를 얻었는지, 왜 뉴욕이 아니겠습니까? – Pred

+0

그냥 첫 번째가 필요하고 나머지는 건너 뜁니다. user_id – mck

+0

먼저 정의하십시오 (데이터 기준) – Pred

답변

1

주어진 사용자에 대해 선택할 수있는 위치를 결정하는 논리는 결코 에게주지 않았습니다. 한 가지 방법은 주어진 사용자와 관련된 최소한의 location_id 가지고하는 것입니다 : 아주 불가능

SELECT t1.*, 
     COALESCE(t2.city, 'NA'), 
     COALESCE(t2.state, 'NA') 
FROM events t1 
LEFT JOIN locations t2 
    ON t1.user_id = t2.user_id 
INNER JOIN 
(
    SELECT user_id, MIN(location_id) AS min_location_id 
    FROM locations 
    GROUP BY user_id 
) t3 
    ON t2.user_id = t3.user_id AND 
     t2.location_id = t3.min_location_id 
1

을, 여기에 문제는 당신이 locations 표 3 개 튜플의이 선택하는 도시가 ID 1와 사용자입니다 큰 질문.

1    1    Los Angeles CA 
2    1    New York NY 
3    1    Chicago  IL 
+0

물론 모든 문제를 이해합니다. 나는 더 분명해야했다. 알 수있는 방법이 없으므로, 나는 오직 첫 번째 매칭 인스턴스와 추가 인스턴스 만 잡아서는 안됩니다. 따라서이 경우 user_id 1의 경우 로스 앤젤레스 캘리포니아 만 빼냅니다. 미안하지만, 나는 몇 년 전에 누군가 내 자리에 넣어 둔 구조로 일하고있다 .--(. – mck