首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySql自连接查询

MySql自连接查询
EN

Stack Overflow用户
提问于 2020-08-15 08:10:55
回答 2查看 57关注 0票数 3

我有这张桌子

代码语言:javascript
复制
mysql> describe skill_usage;
+----------+---------+------+-----+---------+-------+
| Field    | Type    | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| skill_id | int(11) | NO   | MUL | NULL    |       |
| job_id   | int(11) | NO   | MUL | NULL    |       |
+----------+---------+------+-----+---------+-------+

并且要知道,在我的数据中,有一个单独的job_id (6),用于skill_id 3和4:

代码语言:javascript
复制
mysql>  select * from skill_usage;
+----------+--------+
| skill_id | job_id |
+----------+--------+
|        1 |      1 |
|        2 |      2 |
|        3 |      3 |     <----  matches only one part of the AND clause
|        3 |      4 |     <----  matches only one part of the AND clause
|        2 |      5 |
|        3 |      6 |     <==== matches both parts of the AND clause
|        4 |      6 |     <====
|        2 |      7 |
+----------+--------+
8 rows in set (0.00 sec)

以下是我尝试过的:

代码语言:javascript
复制
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 (3,4)
    AND   s2.skill_id IN (3,4)

我认为这意味着“查找与skill_id 3和skill_id 4同时匹配的所有skill_id”。

显然不是:

代码语言:javascript
复制
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 (3,4)
    ->     AND   s2.skill_id IN (3,4);
+--------+
| job_id |
+--------+
|      3 |
|      4 |
|      6 |
+--------+
3 rows in set (0.00 sec)

我做错什么了?我的查询应该怎么读?我认为是时候去读一本好书或者上一门乌德米课程了,但我自己的封面没有一个是自己参加的。

我的查询是正确地找到了job_id = 6,但错误地找到了job_id 3和4,我希望它们会失败AND子句。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-15 08:27:30

替代解决方案。

(参见db小提琴)

代码语言:javascript
复制
select s1.job_id
  from skill_usage s1
  where s1.skill_id = 3
    and s1.job_id in (
                       select s2.job_id
                         from skill_usage s2
                        where s2.skill_id = 4
                     )
票数 1
EN

Stack Overflow用户

发布于 2020-08-15 08:13:54

您可以在这里使用聚合:

代码语言:javascript
复制
SELECT job_id
FROM skill_usage
WHERE skill_id IN (3, 4)
GROUP BY job_id
HAVING MIN(skill_id) <> MAX(skill_id);

此查询应受益于以下索引:

代码语言:javascript
复制
CREATE INDEX idx ON skill_usage (skill_id, job_id);

编写的WHEREHAVING子句都是sargable的,并且应该能够利用这个索引。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63423946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档