MySQL NOT IN来自同一个表中的另一列

jes*_*ica 6 mysql sql

我想运行一个mysql查询来从表films中选择所有行,其中title列的值不存在于另一列(collection)的所有值中的任何位置.

这是我的表的简化版本,内容如下:

mysql> select * from films;
+----+--------------+--------------+
| id | title        | collection   |
+----+--------------+--------------+
|  1 | Collection 1 | NULL         |
|  2 | Film 1       | NULL         |
|  3 | Film 2       | Collection 1 |
+----+--------------+--------------+
Run Code Online (Sandbox Code Playgroud)

这是我的查询:

mysql> SELECT * FROM films WHERE title NOT IN (SELECT collection FROM films);
Empty set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我希望选择与标题行Film 1Film 2,但我的查询返回任何行.

这是表结构:

CREATE TABLE `films` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(200) NOT NULL DEFAULT '',
  `collection` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM;
Run Code Online (Sandbox Code Playgroud)

a_h*_*ame 12

SELECT * 
FROM films 
WHERE title NOT IN (SELECT collection FROM films where collection is not null);
Run Code Online (Sandbox Code Playgroud)

SQLFiddle:http://sqlfiddle.com/#!2/76278/1

  • *不是null*是必需的,因为*not in*的语义规范要求该集合不能包含任何null元素.请参阅http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html上的文档,其中显示*为了符合SQL标准,IN不仅在左侧表达式时返回NULL是NULL,但如果在列表中找不到匹配项,并且列表中的一个表达式为NULL.* (3认同)

Tar*_*ryn 6

你尝试过使用过NOT EXISTS:

SELECT * 
FROM films f1
WHERE NOT EXISTS (SELECT collection 
                  FROM films f2
                  WHERE f1.title = f2.collection);
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo

如果您想使用,IN那么您将需要查找以下值NOT NULL:

SELECT * 
FROM films 
WHERE title NOT IN (SELECT collection 
                    FROM films
                    WHERE collection is not null);
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo

两者的结果是:

| ID |  TITLE |   COLLECTION |
------------------------------
|  2 | Film 1 |       (null) |
|  3 | Film 2 | Collection 1 |
Run Code Online (Sandbox Code Playgroud)

您当前查询的问题是 - 从@ Quassnoi的答案中窃取:

二者INNOT IN返回NULL其不是一个可接受的条件WHERE子句.

由于null您的子查询返回了该值,因此您希望明确地将其排除.