Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL不在同一表的另一列中_Mysql_Sql - Fatal编程技术网

MySQL不在同一表的另一列中

MySQL不在同一表的另一列中,mysql,sql,Mysql,Sql,我想运行一个mysql查询,从一个表中选择所有行,其中title列的值在另一个列集合的所有值中的任何位置都不存在 以下是我的表格的简化版本,其中包含以下内容: mysql> select * from films; +----+--------------+--------------+ | id | title | collection | +----+--------------+--------------+ | 1 | Collection 1 | NULL

我想运行一个mysql查询,从一个表中选择所有行,其中title列的值在另一个列集合的所有值中的任何位置都不存在

以下是我的表格的简化版本,其中包含以下内容:

mysql> select * from films;
+----+--------------+--------------+
| id | title        | collection   |
+----+--------------+--------------+
|  1 | Collection 1 | NULL         |
|  2 | Film 1       | NULL         |
|  3 | Film 2       | Collection 1 |
+----+--------------+--------------+
我的问题是:

mysql> SELECT * FROM films WHERE title NOT IN (SELECT collection FROM films);
Empty set (0.00 sec)
在本例中,我希望选择标题为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;
请试试这个:

查询:

select a.id, a.planid
from one a
left join one b
on a.planid <> b.iid
where not (b.iid is null)
group by b.id
;
要添加的编辑:此处带有OP模式 您是否尝试使用“不存在”:

如果要在中使用,则需要查找不为NULL的值:

两者的结果都是:

| ID |  TITLE |   COLLECTION |
------------------------------
|  2 | Film 1 |       (null) |
|  3 | Film 2 | Collection 1 |
当前查询的问题是-从以下位置窃取:

IN和NOT IN返回NULL,这对于WHERE子句来说是不可接受的条件

由于子查询返回空值,因此您希望明确排除它

SELECT * 
FROM films 
WHERE title NOT IN (SELECT collection FROM films where collection is not null);

SQLFIDLE:

使用外部联接的另一个选项

SELECT f.* 
FROM films f LEFT OUTER JOIN films ff
ON f.title = ff.collection
WHERE ff.collection IS NULL
我必须为匹配的日期和时间选择可用的表名

示例选择可用表格名称,其中日期时间=2014-08-18 12:00 am

解决方案查询是: 我相信这很管用

SELECT distinct res_table_name FROM reservation_tables WHERE `res_table_name` NOT IN   
(SELECT `res_table_name` FROM reservation_tables where `date_time` = '2014-08-17 12:00 am')

不重新调整任何行的原因是结果集中没有考虑NULL。我暗自怀疑如果你用空字符串替换NULL,这可能会解决您的问题。@JoshuaBurns我对此进行了测试,但似乎不是问题所在。包含null的Not in Set始终不返回任何行。这是一个dup,该答案不符合OP的模式。@njk我的逻辑是正确的:我还添加了OP的模式。@Jessica请尝试一下并发表评论。:+1我想你是在我用IN版本编辑我的时发布的谢谢,我接受你的,因为这是第一个正确答案,也是我将要使用的答案。您能解释一下为什么is not null使它工作吗?之所以需要is not null,是因为not in的语义规范要求集合不能包含任何null元素。请参阅文档,其中说明要遵守SQL标准,IN不仅在左侧的表达式为空时返回空值,而且在列表中找不到匹配项且列表中的一个表达式为空时也返回空值。@jessica您要求提供有关为什么需要从子查询中筛选空值的更多详细信息-请参阅或。甚至是由写这些文章的同一个人写的。
SELECT * 
FROM films 
WHERE title NOT IN (SELECT collection 
                    FROM films
                    WHERE collection is not null);
| ID |  TITLE |   COLLECTION |
------------------------------
|  2 | Film 1 |       (null) |
|  3 | Film 2 | Collection 1 |
SELECT * 
FROM films 
WHERE title NOT IN (SELECT collection FROM films where collection is not null);
SELECT f.* 
FROM films f LEFT OUTER JOIN films ff
ON f.title = ff.collection
WHERE ff.collection IS NULL
CREATE TABLE IF NOT EXISTS `reservation_tables` (
  `res_table_id` int(10) NOT NULL AUTO_INCREMENT,
  `res_table_name` int(10) NOT NULL,
  `date_time` varchar(20) NOT NULL,
  `partyhall_id` int(10) NOT NULL,
  `flag` enum('0','1') NOT NULL DEFAULT '0',
  PRIMARY KEY (`res_table_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;


INSERT INTO `reservation_tables` (`res_table_id`, `res_table_name`, `date_time`, `partyhall_id`, `flag`) VALUES
(1, 1, '2014-08-17 12:00 am', 7, '1'),
(2, 2, '2014-08-17 12:00 am', 7, '1'),
(3, 3, '2014-08-18 12:00 am', 8, '1'),
(4, 4, '2014-08-18 12:00 am', 8, '1'),
(5, 1, '2014-08-25 12:00 am', 12, '1'),
(6, 2, '2014-08-25 12:00 am', 12, '1'),
(7, 3, '2014-08-20 12:00 am', 23, '1'),
(8, 4, '2014-08-20 12:00 am', 23, '1');
SELECT distinct res_table_name FROM reservation_tables WHERE `res_table_name` NOT IN   
(SELECT `res_table_name` FROM reservation_tables where `date_time` = '2014-08-17 12:00 am')