回答

收藏

MySql 自 JOIN 查询

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

我有这张表
/ w  P( s# i+ W3 O$ ^. m6 q
    mysql> describe skill_usage; ---------- --------- ------ ----- --------- ------- | Field    | Type    | Null | Key | Default | Extra | ---------- --------- ------ ----- --------- ------- | skill_id | int(11) | NO   | MUL | NULL    |       || job_id   | int(11) | NO   | MUL | NULL    |       | ---------- --------- ------ ----- --------- -------
    4 F, Y0 t4 p9 w! j; @' z# s) f' ]& K
并且知道在我的数据中,有一个job_id(6) 用于skill_id3 和 4:1 s) Q% O: U' U2 W
    ! n% \: a/ t4 A, ^6 j
  • 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)
    & v. j- d0 V; H4 A
我认为这意味着找到一切job_id与skill_id3 和skill_id4匹配的”。
1 {5 w3 _' f5 T/ w" G显然不是:& L7 H; I/ _- q( r+ \& q! S
    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)
    - Z% `+ _8 |4 T* v$ C) L% \% X# f
我做错了什么?如何阅读我的查询?我想是时候写一本好书或 了Udemy 课程,但我没有自己的封面。' q! k, G+ ^: G% w( v
正确找到我的查询job_id= 6,但是错了(IMO)找到了job_id3 和 4AND条款。- P% f! @- H+ K  i
                                                               
% l# q4 ^5 @& \# h# x, i2 f    解决方案:                                                               
9 r9 Z3 A' Z$ P- g/ q+ @+ d3 r                                                                您可以在这里使用聚合物:
- K# i7 l: m! p
    SELECT job_idFROM skill_usageWHERE skill_id IN (3,4)GROUP BY job_idHAVING MIN(skill_id)  MAX(skill_id);; C( [; O* [& D4 G* Q) t! }3 a
本查询应受益于以下索引:
, B  c/ S+ e, _% H# [
    CREATE INDEX idx ON skill_usage (skill_id,job_id);/ \! o# E- j0 k# Q, n' A
所写的WHEREandHAVING子句都是sargable,并且应该能够使用这个索引。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则