php – MySQL“NOT IN”查询3个表

我有3个课程,成绩和评估.我想比较两个表等级和评估.如果表评估中不存在表级中的数据,则会出现数据(输出)

table and output

"   select Grade.ID_Courses,Course.ID_Courses,Grade.NAME, 
    Course.NAME, Grade.ID_Courses,
    Evaluation.NAME,
    Evaluation.Year,    
    Grade.Year
    from Grade, Course, Evaluation
    WHERE 
    Grade.ID_Courses=Course.ID_Courses AND 
    Grade.NAME=JOHN and 
    Grade.Year=1 and 
    Evaluation.NAME=GRADE.NAME and
    Grade.ID_Courses NOT IN (SELECT ID_Courses FROM Evaluation where NAME=JOHN and Year=1 )
    GROUP BY Grade.ID_Courses"

问题是当名称john不在表评估中时,没有输出出来.

解决方法:

如果是的话,避免像瘟疫一样

SELECT ID_Courses FROM Evaluation where `NAME`='JOHN' and Year=1

可以包含NULL.相反,使用NOT EXISTS或Left Joins

使用显式连接,而不是使用WHERE子句的1980年代样式连接

为了说明NOT IN的痛苦:

sql NOT IN()危险

create table mStatus
(   id int auto_increment primary key,
    status varchar(10) not null
);
insert mStatus (status) values ('single'),('married'),('divorced'),('widow');

create table people
(   id int auto_increment primary key,
    fullName varchar(100) not null,
    status varchar(10)  null
);

Chunk1:

truncate table people;
insert people (fullName,`status`) values ('John Henry','single');
select * from mstatus where `status` not in (select status from people);

** 3行,如预期**

Chunk2:

truncate table people;
insert people (fullName,`status`) values ('John Henry','single'),('Kim Billings',null);
select * from mstatus where status not in (select status from people);

没有行,对吧?

显然这是’不正确’.它源于sql使用三值逻辑,
由NULL的存在驱动,一个非值表示丢失(或UNKNowN)信息.
使用NOT IN,Chunk2它的翻译如下:

status NOT IN ('married', 'divorced', 'widowed', NULL)

这相当于:

NOT(status='single' OR status='married' OR status='widowed' OR status=NULL)

表达式“status = NULL”的计算结果为UNKNowN,根据三值逻辑的规则,
NOT UNKNowN也评估为UNKNowN.结果,所有行都被过滤掉,查询返回一个空集.

可能的方案包括

select s.status
from mstatus s
left join people p
on p.status=s.status
where p.status is null

或使用不存在

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...