2013-07-23 85 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

工作。非常感謝。 –