我遇到一个问题,它是,

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;

为什么在上面的查询中使用自左联接.

SELECT survey_set_id, type, value FROM survey_condition_filter WHERE type IN (2000, 2001, 2002);

上面的查询不是等同于第一个使用自左联接的查询吗?因为查询只过滤了IN (2000, 2001, 2002) AND it2.value IS NULL.我在这里混淆了连接查询的用法,并且不能真正理解第一个查询的工作原理.

这是survey_condition_filter号桌

+---------------+--------------+------+-----+---------+-------+
| Field         | Type         | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+-------+
| survey_id     | bigint       | NO   | PRI | NULL    |       |
| survey_set_id | bigint       | NO   | PRI | NULL    |       |
| type          | int          | NO   | PRI | NULL    |       |
| condition     | tinyint      | NO   | PRI | NULL    |       |
| value         | varchar(15)  | NO   | PRI | NULL    |       |
| display_value | text         | NO   |     | NULL    |       |
| order         | int          | YES  |     | NULL    |       |
| created_at    | datetime     | NO   |     | NULL    |       |
| created_by    | varchar(255) | YES  |     | NULL    |       |
| updated_at    | datetime     | NO   |     | NULL    |       |
| updated_by    | varchar(255) | YES  |     | NULL    |       |
| deleted_at    | datetime     | YES  |     | NULL    |       |
| deleted_by    | varchar(255) | YES  |     | NULL    |       |
+---------------+--------------+------+-----+---------+-------+

推荐答案

这是一种反联接.我们外部联接一个表,但随后只保留外部联接的行(通过在这里应用WHERE ... it2.value IS NULL).在我看来,使用直接的NOT EXISTS(在许多情况下是NOT IN)要常见得多,可读性也更好.

SELECT it1.survey_set_id, it1.type, it1.value
FROM survey_condition_filter it1 
WHERE it1.type IN (2000, 2001, 2002) 
AND NOT EXISTS
(
  SELECT null
  FROM survey_condition_filter it2 
  WHERE it2.survey_set_id = it1.survey_set_id
  AND it2.type = 3002
);

该查询的作用很明显: Select 所有类型为2000/2001/2002的行,其中3002行对应于相同的Survey_set_id.

如果Survey_set_id是不可为空的列,则可以使用NOT IN,这会使查询更短一些:

SELECT it1.survey_set_id, it1.type, it1.value
FROM survey_condition_filter it1 
WHERE it1.type IN (2000, 2001, 2002) 
AND itl.survey_set_id NOT IN
(
  SELECT it2.survey_set_id
  FROM survey_condition_filter it2 
  WHERE it2.type = 3002
);

Mysql相关问答推荐

括号在SQL查询中的作用?

创建从表中筛选数据的过程时出错

同一类型对象之间的多对多关系

用于搜索从各种表中获得的结果的查询

用于将重复行的唯一列值作为单独列获取的SQL查询

使用MySQL工作台导出具有数据的数据库表并导入到其字段具有不同数据类型的同一表中

Ballerina SQL 中是否也应该考虑输入清理?

判断一列中的多个值并返回值 1 或 0

MySQL 8 - MBRContains 不使用空间索引

如何从将分钟、天、月和年存储在不同列中的表中查询数据

查询以从约会表中获取可用空档

MYSQL LOAD DATA INFILE 语句适用于工作台,但不适用于 python

MySQL 视图

用序列号mysql更新列

Python MYSQL 更新语句

MySQL INSERT IF(自定义 if 语句)

如何删除没有临时表的 MySQL 表中的所有重复记录

将 mySQL 查询作为 cron 作业(job)运行?

如何将 MySQL 查询结果存储在另一个表中?

MySQL:切换 int 字段值的简单方法