回答

收藏

MySql 自 JOIN 查询

技术问答 技术问答 298 人阅读 | 0 人回复 | 2023-09-12

我有这张表8 Q2 X' d7 f+ J" \, `# |+ U
    mysql> describe skill_usage; ---------- --------- ------ ----- --------- ------- | Field    | Type    | Null | Key | Default | Extra | ---------- --------- ------ ----- --------- ------- | skill_id | int(11) | NO   | MUL | NULL    |       || job_id   | int(11) | NO   | MUL | NULL    |       | ---------- --------- ------ ----- --------- ------- % H' f9 s1 n' T0 R: b
并且知道在我的数据中,有一个job_id(6) 用于skill_id3 和 4:3 }5 z+ e6 ~! O9 x: u8 U
    : @4 j/ N! Q3 R' r2 d# T) J3 E! i
  • mysql>  select * from skill_usage; ---------- -------- | skill_id | job_id | ---------- -------- |     |      1 ||     |     2 ||         3 3   3                      |     3 |     这是我试过的:[code]SELECT DISTINCT s1.job_id FROM skill_usage AS s1   INNER JOIN skill_usage AS s2 ON s1.job_id = s2.job_id    WHERE s1.skill_id IN   AND   s2.skill_id IN (3)4)
    . C! I) P7 O1 r) S4 J
我认为这意味着找到一切job_id与skill_id3 和skill_id4匹配的”。
& d1 B1 Y; @) x: i5 k1 b显然不是:; |3 ]0 A9 X0 Z( w+ a7 _
    mysql> SELECT DISTINCT s1.job_id FROM skill_usage AS s1    ->   INNER JOIN skill_usage AS s2 ON s1.job_id = s2.job_id    ->     WHERE s1.skill_id IN   ->     AND   s2.skill_id IN -------- | job_id | -------- |     3 ||      4 ||      6 | -------- 3 rows in set (0.00 sec)
    + O6 e% Z6 j) G' d4 e8 I
我做错了什么?如何阅读我的查询?我想是时候写一本好书或 了Udemy 课程,但我没有自己的封面。) Q* Y7 d7 Y( y; U- h
正确找到我的查询job_id= 6,但是错了(IMO)找到了job_id3 和 4AND条款。, E" T. _+ z: b
                                                                " B5 C% p1 C) _) n' q
    解决方案:                                                               
- M# w# V# c! T) J# v$ h0 P7 P2 L                                                                您可以在这里使用聚合物:8 i+ @! w* q" G7 u9 |! ?) J2 a2 m
    SELECT job_idFROM skill_usageWHERE skill_id IN (3,4)GROUP BY job_idHAVING MIN(skill_id)  MAX(skill_id);
    4 R5 P) T4 J- B0 O' v( ?0 f
本查询应受益于以下索引:1 N$ o6 W2 _- A& V4 ^8 e
    CREATE INDEX idx ON skill_usage (skill_id,job_id);
    3 z( S" b. K. X2 k  O4 h
所写的WHEREandHAVING子句都是sargable,并且应该能够使用这个索引。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则