MySQL“WHERE IN”产生正确的结果,但“WHERE NOT IN”没有

时间:2013-11-03 01:48:49

标签: mysql debugging

这是表结构

CREATE TABLE `student_classlists` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `SessionCode` int(5) DEFAULT NULL,
  `CourseCode` varchar(10) DEFAULT NULL,
  `SectionCode` varchar(1) DEFAULT NULL,
  `LastName` varchar(255) DEFAULT NULL,
  `FirstName` varchar(255) DEFAULT NULL,
  `StudentId` int(10) unsigned DEFAULT NULL,
  `FinalGradeSIS` int(10) DEFAULT NULL,
  `Status` varchar(10) DEFAULT NULL,
  `Faculty` varchar(255) DEFAULT '',
  `Email` varchar(255) DEFAULT NULL,
  `ClassListDate` date DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=576 DEFAULT CHARSET=utf8;

Status列主要由NULL行组成,只有少数例外。我试图忽略那些非空的记录。以下查询不起作用:

SELECT StudentId FROM student_classlists WHERE `Status` NOT IN ('Drop') GROUP BY StudentId

由于某种原因,它会产生意外和空的结果。但是一个非常相似的查询除了删除NOT之外唯一的例外就会产生预期的结果

SELECT StudentId FROM student_classlists WHERE `Status` IN ('Drop') GROUP BY StudentId

这里发生了什么?

2 个答案:

答案 0 :(得分:1)

NULL状态的行不会出现在输出中,因为它们既不在IN列表的内部也不在COALESCE列表之外。要获取这些行,请添加SELECT StudentId FROM student_classlists WHERE COALESCE(`Status` NOT IN ('Drop'), 1) GROUP BY StudentId ,如下所示:

NULL

这实际上表示必须包含Status列中{{1}}值的记录。

答案 1 :(得分:0)

如果您只想要NULL Status条记录,则可以执行以下操作:

SELECT StudentId FROM student_classlists WHERE Status IS NULL