php - MySQL “NOT IN” 查询3张表

标签 php mysql sql

我有 3 个表格类(class)、成绩和评估。我想比较两个表的等级和评价。如果表成绩中的数据在表评价中不存在,则该数据会出现(输出)

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 不在表评估中时,就没有输出。

最佳答案

像瘟疫一样避免NOT IN如果

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

可能包含 NULL。相反,使用 NOT EXISTS 或左连接

使用显式连接,而不是使用 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
);

block 1:

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

** 3 行,符合预期 **

block 2:

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 的存在驱动,NULL 是一个表示缺失(或未知)信息的非值。 对于 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

或使用不存在

关于php - MySQL “NOT IN” 查询3张表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32175497/

相关文章:

php - 编写总结验证 javascript 代码

php - MySQL WHERE 日期小于 Y-m

php - 是否可以一次将多个数据添加到一列中?

sql - 从 SQL Server 中没有公共(public)字段进行连接的两个表中进行选择的正确方法

php - Paypal IPN 无法将货币类型从美元更改为英镑

javascript - 替换图像 src 和 href onclick

mysql - 从表中选择最新的不同电子邮件地址

sql - 在 SQL Server 中将时间字段分组为 5 分钟时间段

sql - 在 MySQL 的连接中优化 OR

javascript - 用户登录时重定向不起作用