mysql - 优化通过 has_many :through association 检索 ID 的方式

标签 mysql sql ruby-on-rails ruby model

我有 3 个模型如下: (我还描述了数据库结构,以防不熟悉 RubyOnRails 的人能够帮助我)


线程.rb

class Thread
  has_many :thread_profils
  has_many :profils, :through => :thread_profils
end

线程

integer: id (PK)

ThreadProfil.rb

class ThreadProfil
  belongs_to :thread
  belongs_to :profil
end

thread_profils

integer: id (PK)
integer: thread_id (FK)
integer: profil_id (FK)

Profil.rb

class Profil
end

配置文件

integer: id (PK)

在我的一个 Controller 中,我正在寻找最优化的方法来查找包含恰好两个配置文件(当前一个,另一个)的线程 ID ):

我得到了我的 current_profil.id 和另一个 profil.id 但我想不出一个简单的方法来获取 的集合/列表/数组Thread.id,同时处理较少的SQL请求。


目前我找到的唯一解决方案是以下一个,我认为它根本没有被“优化”。

thread_profils = ThreadProfil.where(:profil_id => current_profil.id)
thread_ids = thread_profils.map do | association |
  profils = Thread.find(association.thread_id).profils.map do | profil | 
      profil.id if profil.id != current_profil.id
  end.compact
  if (profils - [id]).empty?
    association.thread_id
  end
end.compact

正在处理以下 SQL 查询:

SELECT `thread_profils`.* FROM `thread_profils` WHERE `thread_profils`.`profil_id` = [current_profil.id]

对于每个结果:

SELECT `threads`.* FROM `threads` WHERE `threads`.`id` = [thread_id] LIMIT 1

SELECT `profils`.* FROM `profils` INNER JOIN `thread_profils` ON `profils`.`id` = `thread_profils`.`profil_id` WHERE `thread_profils`.`thread_id` = [thread_id]

是否有任何简单的方法可以使用 rails 或直接使用 SQL?

谢谢

最佳答案

我在 sql 中发现了以下查询:

SELECT array_agg(thread_id) FROM "thread_profils" WHERE "thread_profils"."profil_id" = 1 GROUP BY profil_id HAVING count(thread_id) =2

注意:array_agg 是一个 postgres 聚合函数。 Mysql 有 group_concat,它会给你一个逗号分隔的 ID 字符串,而不是一个数组。

此 sql 由以下 Rails 代码生成:

 ThreadProfil.select('array_agg(mythread_id)').where(profil_id: 1).group(:profil_id).having("count(thread_id) =2").take

这会生成正确的查询,但结果作为 ThreadProfil 没有意义 - 不过,您可以进一步使用它来获得您想要的结果。

关于mysql - 优化通过 has_many :through association 检索 ID 的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21862171/

相关文章:

mysql - Sql获取与特定用户没有关系的所有用户

php - 如何根据一个 id 列表动态插入多行

ruby-on-rails - Rails 使用复数表名,即使我告诉它使用单数

sql - 转让认购报告服务

ruby-on-rails - RVM 错误 : "Unknown ruby interpreter version" when trying to verify an . rvmrc 文件

ruby-on-rails - 在 ActiveRecord 中包含 where 子句

mysql - ruby mysql 时间戳差异

mysql - 如何在 MARIADB/MYSQL 中为函数/过程声明表到变量?

sql - 在 Postgresql 中以间隔添加日期作为参数的准备语句

java - 如何处理 Jooq 中的日期?