回答

收藏

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

技术问答 技术问答 301 人阅读 | 0 人回复 | 2023-09-14

给定m2m关系: 项目类别 我有三个表:
( N, q# \$ x/ A9 w, i3 {7 u+ [5 f1 j
类别$ {: m) m6 Z# O* b! z5 o1 i9 m, M
items_categories 包含对两者的引用  _, m4 W( V4 E) a

( m3 _0 }$ P2 p! W# ]我想找到属于 所有给定 类别集的项目:
. J8 {" n6 q% }5 @% f4 t9 _Find Item ( O9 R, F9 r2 Q) F3 K5 J7 \
belonging to a category in [1,3,6]
8 [" U7 ~" |& G$ X; w6 ?6 ^and belonging to a category in [7,8,4]
# k( g8 a) {4 u0 x9 ^! E( [and belonging to a category in [12,66,42]
6 |- R( G' `; ], ~4 ]  vand ...
, a' O; G9 n8 [; y# \! U' u我可以考虑通过两种方法在mySQL中完成此操作。
8 D) t1 n! S0 h& Y选项A:内联:
4 d5 l- v1 E4 U/ T+ pSELECT id from items . ^0 q8 e9 L0 a- i# c
INNER JOIN category c1 ON (item.id = c1.item_id). r  v+ ?. r- m- n6 t; m
INNER JOIN category c2 ON (item.id = c2.item_id)
( c5 D/ k8 o' ?, j6 @; q' DINNER JOIN category c3 ON (item.id = c3.item_id)1 R4 U2 K9 G5 E- g8 z7 g
...
% Z( o; R" d- C0 ]: KWHERE3 x- j' w5 T3 y- [3 Q
c1.category_id IN [1,3,6] AND! B( W  m6 p% H( w
c2.category_id IN [7,8,4] AND4 a5 J& D" Q9 k0 z0 h
c3.category_id IN [12,66,42] AND" |) ]/ B/ Q# c: b; u) n& ?3 O5 n0 v
...;6 f/ t/ d7 U2 j2 y" j
选项B:存在:2 N5 m" l8 _/ T- }: f1 ]+ h
SELECT id from items
+ |6 m* E3 d6 V/ z! g! G; h6 ~" GWHERE7 V% N3 m4 k; I/ {
EXISTS(SELECT category_id FROM category WHERE category.item_id = id AND category_id in [1,3,6] AND
! O: p* G& f/ I, Y. }EXISTS(SELECT category_id FROM category WHERE category.item_id = id AND category_id in [7,8,4] AND% {8 S5 u/ x) s
EXISTS(SELECT category_id FROM category WHERE category.item_id = id AND category_id in [12,66,42] AND! W, j4 B, |9 h9 S8 D( Q6 U/ ?
...;
% j0 z, c' p1 P* x- x这两个选项都可以。问题是: 对于大型项目表,最快/最合适的哪一个? 还是缺少OPTION CI?
+ T$ n% A/ f/ h8 B4 n                - O# ]* u. c9 k- J! T" z0 @
解决方案:
+ U: i2 p/ S$ ~% D8 @                ( @3 _- D" h' S  L1 _7 d/ Q

( s1 L" M8 O/ O/ C# T" R& C( s8 N: F
                选项A3 I5 ~. J7 H; W! a9 r
JOIN与相比具有一个优势EXIST,因为它将更有效地使用索引,尤其是在大型表的情况下
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则