1

下面是兩個表的一些樣本數據中的所有記錄: -獲取存在兩個表

Uploads: 
id: 1 , file_ref:abc 
id: 2, file_ref: abc1 
id: 4, file_ref: abc3 
id: 5, file_ref: abc4 
id: 6, file_ref: abc5 
id: 7, file_ref: abc6 

media: 
id: 3, name: 'My Doc' , type: doc 
id: 6, name: 'My Img' , type: img 

我有這2種型號的軌道。 現在在我的控制器中,我希望在媒體表中存在上傳的所有記錄,即來自使用ID 3和6的上傳表的記錄。

+1

該ID是共享的?因此,唯一的記錄是'id:6,file_ref:abc5 ',因爲'id 3'在表格媒體中不存在? – MatayoshiMariano

+0

您可以將** abc5 **的值更改爲** 5 **,還是您必須首先獲取該號碼,然後才能找到 – MZaragoza

+0

上傳中將存在所有媒體,但file_ref僅在上傳中可用這是我想要的。所以我必須從上傳表格中獲取id 6和3的記錄。 – AHK

回答

0

你需要的是INNER JOIN其中加盟條件必須是

Upload.joins("INNER JOIN medias ON media.id = uploads.id") 

這將轉換表的ID:

"SELECT `uploads`.* FROM `uploads` INNER JOIN media ON media.id = uploads.id" 

編輯:

由於MrYoshiji在此說commentUpload.where(id: Media.all)也會做單個查詢。

所以這兩個選項的選擇將返回所有上傳記錄哪個ID存在於媒體表

0

您是否在它們之間建立了關係?從它的聲音,你沒有(你真的應該),但如果你有沒有再嘗試:

ids = Media.all.ids 
Upload.where(id: ids) 

或一行

Upload.where(id: Media.all.ids) 

這將在上傳回的所有記錄表具有存在於媒體表中的ID。

+0

Mark,這樣做的缺點是,您正在對數據庫執行兩個查詢,一個用於「Media.all.ids」,另一個用於「Upload.where」。用INNER JOIN你只做一個。 – MatayoshiMariano

+1

'Upload.where(id:Media.all)'將執行一個嵌套的'SELECT medias.id [FROM] FROM medias'的SQL查詢 - 但這很奇怪,假設Media <->上傳關係是唯一的由他們的'id'平等定義 – MrYoshiji

+0

正如@MrYoshiji提到的,​​沒有'ids',它會做一個查詢 – MatayoshiMariano

0

你可以做一個子查詢您的通話

我認爲應該是這個樣子

Upload.where(media_id: Media.all.map(&:id))

我希望它有幫助