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

使用INNER JOIN或EXISTS在m2m关系中查找属于几个的更好吗?

东门佐
2023-03-14
问题内容

给定m2m关系: 项目类别 我有三个表:

  • 类别
  • items_categories 包含对两者的引用

我想找到属于 所有给定 类别集的项目:

Find Item 
belonging to a category in [1,3,6] 
and belonging to a category in [7,8,4] 
and belonging to a category in [12,66,42]
and ...

我可以考虑通过两种方法在mySQL中完成此操作。

选项A:内联:

SELECT id from items 
INNER JOIN category c1 ON (item.id = c1.item_id)
INNER JOIN category c2 ON (item.id = c2.item_id)
INNER JOIN category c3 ON (item.id = c3.item_id)
...
WHERE
c1.category_id IN [1,3,6] AND
c2.category_id IN [7,8,4] AND
c3.category_id IN [12,66,42] AND
...;

选项B:存在:

SELECT id from items
WHERE
EXISTS(SELECT category_id FROM category WHERE category.item_id = id AND category_id in [1,3,6] AND
EXISTS(SELECT category_id FROM category WHERE category.item_id = id AND category_id in [7,8,4] AND
EXISTS(SELECT category_id FROM category WHERE category.item_id = id AND category_id in [12,66,42] AND
...;

这两个选项都可以。问题是: 对于大型项目表,最快/最合适的哪一个? 还是缺少OPTION CI?


问题答案:

选项A

JOIN与相比具有一个优势EXIST,因为它将更有效地使用索引,尤其是在大型表的情况下



 类似资料:
  • 问题内容: 我以前是这样写我的EXISTS检查的: 前一世代的DBA告诉我,当我做一个子句时,请使用而不是 这真的有区别吗? 问题答案: 不,SQL Server很聪明,并且知道它已用于EXISTS,并且不向系统返回任何数据。 Quoth Microsoft:http ://technet.microsoft.com/en- us/library/ms189259.aspx?ppud =4 由EX

  • 问题内容: 在django在线课程中,讲师让我们使用该函数调用视图并使用列表中的正则表达式。我在YouTube上看到了其他示例。例如 但是,在阅读Django教程时,他们改用例如: 此外,正则表达式似乎不适用于该函数,因为使用将找不到视图。 是否使用没有正则表达式匹配的正确方法前进?是更强大,但更复杂,所以他们正在使用与开始我们吗?还是针对不同工作使用不同工具的情况? 问题答案: 从Django文

  • 我目前正在用Laravel构建我的第一个应用程序,我偶然发现了一个问题,即我不知道如何设置模型(用户和组)之间的多对多关系。 我已经创建了一个板,其中存储了所有用户和他们所在的组之间的关系。我的问题是,我不知道如何访问和设置这在Laravel。我不确定我是否必须用户has很多或属性。 我正试图找到一种方法,将用户添加到组中,以便在UserGroups表中创建一个新条目。 我的桌子: 用户 ID 集

  • 我继承了一个项目,它有一些CRUD形式...在创建表单中,我们需要创建一个和关系的条目。所以基本上我得到的是以下这些 我不确定这是否是最好的方法,但似乎有效。 我遇到的问题是,在表单中,这些参与者/评论可以编辑、添加或删除,我不确定如何更新它们。是否可以更新它们,或者删除现有关系数据并重新添加它们是否更好? 我从来没有更新过关系,只是添加了它们,所以我不确定如何开始。 任何帮助都将不胜感激。

  • 问题内容: 假设我有一个模型,并且想验证是否 可以添加s个以上的代码: 但是,试图保存时, 一个 因为超过最大递归深度被抛出。 错误如下: 它发生在行中。 显然,在保存模型时,Django的复杂性根本不允许您验证m2m关系。那我该如何验证它们呢? 问题答案: 您 永远无法 使用模型的干净方法来验证关系。这是因为在清理时间,该模型可能不存在,就像您的购物篮一样。不存在的东西,也可能没有关系。 您要么

  • 问题内容: 我知道索引 查找 比索引 扫描 更好,但是在SQL Server解释计划中它更可取:索引查找或键查找(在SQL Server 2000中为书签)? 请告诉我,他们没有再次更改SQL Server 2008的名称… 问题答案: 每次索引检索。 查找非常昂贵,因此它涵盖了索引,尤其是添加了INCLUDE子句以使索引更好。 举例来说,假设您只希望一行,那么在查找后进行查找可能比尝试覆盖查询要