2013-07-23 50 views
4

我是初学者。使用SQL连接和子查询来查询R中的两个表格

我有两个.txt文件和我使用R 3与sqldf PAKAGE查询他们

第一个表(venues.txt)是这样的:

userID,venueID,year,month,date,hour 
1302,47,2012,2,24,11 
45,132,2012,2,24,11 
24844,86,2012,2,24,11 
896,248,2012,2,24,11 
5020,29,2012,2,24,11 

第二个表(朋友.TXT)是这样的:

userID,friendID 
1,5 
1,9 
1,50 
1,102 
1,300 

我要查询的地点(venueID),用户(比如用户ID = 1)访问与一个或多个他的朋友(friendID)

注:这两个用户ID,朋友表friendID可能与用户ID在场地表

查询结果应该是这样的:

venueID friendID 
47  5 
47  9 
29  102 
86  102 

我可以做到这一点使用许多单独的查询,然后加入他们在一个表中,但我的数据集非常大。有没有更简单的方法来做到这一点?

我能够查询已访问由用户或他的朋友所有场馆:

sqldf("select userID, venueID from data 
     where userID=1 OR userID IN (select friendID from freind where userID=1)") 

非常感谢。

+1

你的意思是说,你想要一个用户访问过的地点列表,他的一个朋友也访问了这个列表?换句话说,至少有两个朋友参观过的场馆列表?或者你想要一个至少有两个朋友一起参观的场所列表,所以具有相同的年份,月份,日期,小时? –

+0

我需要两个实际。这将是greaat! –

回答

1

我是一个Java PL/SQL开发人员,所以这里是我的答案:“至少有两个朋友访问的场地列表” 只使用连接并假设来自venues.txt的数据称为场地和friends.txt文件在FROM子句中称为friend。基本上,我假设这些文件是表格。

SELECT v1.venueID, f.friendID 

FROM venues v1 
INNER JOIN friends f ON v1.userID = f.userID 
INNER JOIN venues v2 ON v2.userID = f.friendID 

WHERE 
    v1.venueID = v2.venueID 

,如果你想添加更多的条件,即“至少两个朋友一起参观,所以具有相同的年,月,日,时”,那么只需将它们添加到过滤器(WHERE子句)。因此,查询应该是这样的:

SELECT v1.venueID, f.friendID 

FROM venues v1 
INNER JOIN friends f ON v1.userID = f.userID 
INNER JOIN venues v2 ON v2.userID = f.friendID 

WHERE 
    v1.venueID = v2.venueID 
    v1.year = v2.year 
    v1.month = v2.month 
    v1.date = v2.date 
    v1.hour = v2.hour 

如果在场地超过2周的朋友可能需要在SELECT语句中使用DISTINCT(或可选择在同一时间)。

+0

工作。非常感谢。 –