4

我是初学者。

我有两个 .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)

注意:friends 表的 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)")

非常感谢。

4

1 回答 1

1

我是一名 Java pl/sql 开发人员,所以这是我要回答的问题:“至少有两个朋友访问过的场所列表”,仅使用 join 并假设来自场所的数据称为场所,而 friends.txt 文件是在 FROM 子句中称为朋友。基本上,我假设这些文件是表。

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。

于 2013-07-24T06:36:36.700 回答