2017-01-03 62 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