当前位置: 首页 > 面试题库 >

HABTM发现带有``ND''个联接,而不是``R''个联接。

师赤岩
2023-03-14
问题内容

我有两个与HABTM关联的模型(实际上在两端都使用has_many:through以及联接表)。我需要检索与两个ModelB都关联的所有ModelAs。我不希望将ModelB_1的所有ModelA与ModelB_2的所有ModelA串联在一起。我确实希望所有与ModelB_1和ModelB_2都关联的ModelAs。它不仅限于2个ModelB,最多可以包含50个ModelB,因此必须扩展。

我可以使用多种类比来描述问题,我认为比上一段更好地描述了我的问题:

* Find all books that were written by all 3 authors together.
* Find all movies that had the following 4 actors in them.
* Find all blog posts that belonged to BOTH the Rails and Ruby categories for each post.
* Find all users that had all 5 of the following tags: funny, thirsty, smart, thoughtful, and quick.   (silly example!)
* Find all people that have worked in both San Francisco AND San Jose AND New York AND Paris in their lifetimes.

我想到了多种方法来实现此目的,但它们的效率非常低下,并且对此感到非常皱眉。

以上面的类比为例,说最后一个,您可以对每个城市中的所有人进行查询,然后在每个数组中找到每个数组中存在的项目。至少有5个查询,这些查询的所有数据都被传输回应用程序,然后应用程序必须密集地将所有5个数组相互比较(循环大量!)。太讨厌了吧?

另一个可能的解决方案是将查找结果彼此链接在一起,这基本上与上面的操作相同,但是不会消除多个查询和处理。另外,如果您有用户提交的复选框或值可能高达50个选项,您将如何动态化链条?似乎很脏。您需要一个循环。再次,这将增加搜索持续时间。

显然,如果可能的话,我们希望数据库可以为我们执行此操作,因此,有人向我建议我只需要输入多个条件即可。不幸的是,通常只能对HABTM进行“或”操作。

我遇到的另一个解决方案是使用搜索引擎,例如sphinx或UltraSphinx。对于我的特殊情况,我觉得这太过分了,我宁愿避免这种情况。我仍然觉得应该有一个解决方案,使用户可以对任意数量的ModelB进行查询并找到所有ModelA。

您将如何解决这个问题?


问题答案:

您可以这样做:

  1. 从您的ModelA构建一个查询,然后(通过连接模型)加入ModelB,过滤出具有您要查找的值之一的ModelB,即将它们放入OR(即where ModelB = 'ModelB_1' or ModelB = 'ModelB_2')。 通过此查询,结果集将具有多个“ ModelA”行,对于每个满足的ModelB条件,该行恰好为一行

  2. 在您需要的ModelA列上的查询中按条件添加一组(如果需要,甚至可以将它们全部添加)。每行 的count( )等于满足的ModelB条件数*。

  3. 添加一个“具有”条件,仅选择count(*)等于您需要满足的ModelB条件数的行

例子:

model_bs_to_find = [100, 200]
ModelA.all( :joins=>{:model_a_to_b=>:model_bs}, 
            :group=>"model_as.id", 
            :select=>"model_as.*",
            :conditions=>["model_bs.id in (?)", model_bs_to_find], 
            :having=>"count(*)=#{model_bs_to_find.size}")

注意,以这种方式指定的组和选择参数将在MySQL中工作,这样做的标准SQL方法是将整个model_as列的列表放入组和选择参数中。



 类似资料:
  • 问题内容: 我需要模拟左联接效果而不使用“左联接”键。 我有两个表,A和B,都带有和列。我想在两个表中都选择所有dbid,其中A中的名称等于B中的名称。 我使用它来进行同步,因此B开头是空的(所以我将使用A的id和B的id为null的对)。稍后,我将混合使用值-value和值-null的夫妇。 通常是: 问题是我无法使用,并且想知道是否/如何做同样的事情。 问题答案: 您可以使用这种方法,但是必须

  • 问题内容: 我有三个表:R,S和P。 表R通过外键与S连接;有 应该 是S中至少一个的记录,所以我可以加入: 如果S中没有记录,那么我没有行,那很好。 然后表S与P联接,其中记录为P可能存在,也可能不存在,并与S联接。 所以我做 如果我想将第二个JOIN绑定到S而不是R,例如我可以使用括号,该怎么办: 还是这已经是R,S和P之间笛卡尔积的自然行为? 问题答案: 各种外部联接和普通联接都在相同的优先

  • 问题内容: 我知道我们可以进行相关的子查询并加入。但是哪一个更快?有黄金法则还是我必须同时衡量这两者? 问题答案: 首先,相关子查询实际上是联接的一种。关于哪一个产生最佳执行计划没有黄金法则。如果您对性能感兴趣,则需要尝试不同的表格以查看最有效的方法。或者,至少,看看执行该决定的执行计划。 通常,出于两个原因,我倾向于避免关联子查询。首先,几乎总是可以在没有相关性的情况下编写它们。其次,许多查询引

  • 问题内容: 我正在使用Hibernate 3.6和MSSQL 2012。 执行此HQL时 我正在获取此SQL 请注意 交叉连接 和where子句中的 附加条件* 。 根据Hibernate docs https://docs.jboss.org/hibernate/core/3.5/reference/en/html/queryhql.html#queryhql- joins- forms 隐式连

  • 根据Hibernate文档https://docs.jboss.org/Hibernate/core/3.5/referen/html/queryhql.html#queryhql-joins-forms 隐式联接应生成为内部联接。 我注意到有一个打开的bug https://hibernate.atlassian.net/browse/hhh-7707可能提到了这个问题,但没有人回答,而且它已经

  • 问题内容: 我不是数据库专家,所以我需要一些有关正在处理的查询的帮助。在我的照片社区项目中,我不仅要显示标签名称和计数器(标签中的图像数量),而且还想显示标签中最受欢迎的图像(最因果),以丰富标签的可视化效果。 表设置如下: 图像表包含基本图像元数据,重要的是因果字段 Imagefile表每个图像包含多个条目,每种格式一个 标签表保存标签定义 Tag_map表将标签映射到图像 在我通常的试验和错误