我想运行一个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 1和Film 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
你尝试过使用过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)
如果您想使用,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)
两者的结果是:
| ID | TITLE | COLLECTION |
------------------------------
| 2 | Film 1 | (null) |
| 3 | Film 2 | Collection 1 |
Run Code Online (Sandbox Code Playgroud)
您当前查询的问题是 - 从@ Quassnoi的答案中窃取:
二者
IN并NOT IN返回NULL其不是一个可接受的条件WHERE子句.
由于null您的子查询返回了该值,因此您希望明确地将其排除.
| 归档时间: |
|
| 查看次数: |
16704 次 |
| 最近记录: |