【问题标题】:Get all records that exist in both the tables获取两个表中存在的所有记录
【发布时间】:2017-08-07 14:56:31
【问题描述】:

下面是两个带有一些示例数据的表格:-

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  

我在 Rails 中有这 2 个模型。 现在,在我的控制器中,如果它们的 id 存在于媒体表中,即上传表中 id 为 3 和 6 的记录,我想获取上传中的所有记录。

【问题讨论】:

  • id是共享的?那么唯一要返回的记录就是id: 6, file_ref: abc5 ,因为id 3在table media中不存在?
  • 能不能把** abc5**的值改成5 还是要先把数字取出来再找
  • 所有媒体都将存在于上传中,但 file_ref 仅在我想要的上传中可用。所以我必须从上传表中获取 id 为 6 和 3 的记录。

标签: ruby-on-rails ruby-on-rails-4 activerecord rails-activerecord rails-models


【解决方案1】:

你可以在你的通话中做一个子查询

我觉得应该是这个样子

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

希望对你有帮助

【讨论】:

    【解决方案2】:

    您需要的是INNER JOIN,其中加入条件必须是表的ID

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

    这将被翻译成:

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

    编辑:

    正如MrYoshiji 在此comment 中所说,Upload.where(id: Media.all) 也将执行单个查询。

    所以这两个选项选项都会返回所有ids存在于媒体表中的上传记录

    【讨论】:

      【解决方案3】:

      你有没有建立他们之间的关系?从听起来你没有(你真的应该),但如果你还没有尝试:

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

      或一行

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

      这将返回您的上传表中具有媒体表中存在的 ID 的所有记录。

      【讨论】:

      • 马克,这样做的缺点是您要对数据库进行两次查询,一次查询Media.all.ids,另一次查询Upload.where。使用 INNER JOIN 你只做一个。
      • Upload.where(id: Media.all) 将使用嵌套的SELECT medias.id [...] FROM medias 执行单个 SQL 查询——但假设 Media 上传关系仅由其 id 的相等性定义是很奇怪的/跨度>
      • 正如@MrYoshiji 提到的,没有ids,它将执行单个查询
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-04
      • 1970-01-01
      • 2016-08-04
      相关资源
      最近更新 更多