You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何该MySQL查询使用自左连接?与普通查询是否等价?

为什么该查询使用自左连接?

首先明确:你认为的普通查询和原查询并不等价,原查询的目的是筛选出更严格的结果集。

原查询的作用

原查询的逻辑是:

从survey_condition_filter表中,选取type为2000、2001、2002的记录,但要排除掉那些同一个survey_set_id下存在type=3002记录的条目。

而你写的普通查询只是单纯选取type在2000-2002的所有记录,完全不考虑同survey_set_id下是否存在type=3002的记录,这是两者的核心区别。

原查询的工作原理拆解

SELECT it1.survey_set_id, it1.type, it1.value 
FROM survey_condition_filter it1 
LEFT JOIN survey_condition_filter it2 
  ON(it1.survey_set_id = it2.survey_set_id AND it2.type = 3002) 
WHERE it1.type IN (2000, 2001, 2002) AND it2.value IS NULL;
  1. 自左连接的作用:

    • it1作为主表,先筛选出所有type为2000、2001、2002的记录
    • 通过LEFT JOIN关联同一张表的it2,关联条件是**同一个survey_set_id**且it2.type=3002
    • 左连接的特性是:即使it2中没有匹配的记录,it1的记录也会被保留,此时it2的所有字段值都是NULL
  2. WHERE条件的过滤:

    • it2.value IS NULL这个条件,就是专门筛选出那些在it2中找不到匹配记录的it1条目——换句话说,就是该survey_set_id下不存在type=3002的记录。

结合表结构理解

从表结构可以看到,survey_set_id、type等多个字段共同构成主键,这意味着同一个survey_set_id下可以存在多条不同type的记录。比如某个survey_set_id=123下,既可以有type=2000的记录,也可以有type=3002的记录。原查询就是要把这类同时存在的type=2000记录排除掉,而普通查询会把它保留。

内容的提问来源于stack exchange,提问作者user15980977

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 12:25:04