2017-01-03 68 views
0

希望有人可以在這裏給我一隻手。我有以下兩個表:SQL Inner Join語句沒有給出想要的結果

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的哪個位置?爲什麼洛杉磯的結果,爲什麼不是紐約? – 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

這是完全不可能的,這裏的問題是ID爲1用戶必須在locations表3元組,選擇哪個城市大問題。

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

我理解所有的問題,當然。我應該更清楚。由於沒有辦法知道,我需要確保我只抓取FIRST匹配實例而不是其他實例。所以在這種情況下,對於user_id 1,它只會拉出洛杉磯CA.對不起,我正在使用幾年前我的其他人使用的結構:-(。 – mck