使用SQL连接和子查询来查询R中的两个表

时间:2013-07-23 13:08:20

标签: sql r join

我是初学者。

我有两个.txt文件,我正在使用R和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

第二个表(friends.txt)如下所示:

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

我想查询用户(比如说userID = 1)与他的一个或多个朋友(friendID)访问的场地(venueID)

注意:朋友表的userID,friendID都可以链接到场地表中的userID

查询结果应如下所示:

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 :(得分:1)

我是一名Java pl / sql开发人员,所以我的回答是:“至少有两位朋友访问的场地列表” 仅使用join并假设来自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。