我有以下表格
他们的关系如下:modulos保存所有模块,mods_alunos只保存每个学生制作的模块(nInterno标识学生)
select modulos.codDisc, modulos.numero from modulos
left join mods_alunos
on modulos.codDisc=mods_alunos.codDisc
and modulos.numero=mods_alunos.numero
where
(mods_alunos.codDisc is null
and mods_alunos.numero is null
)
此查询会丢失模块,但不会将学生纳入考虑范围
我正在寻找列出某个学生缺少的模块的查询
编辑1 - 样本数据
Modulos
codDisc | numero
------- | ------
1 | 1
1 | 2
1 | 3
2 | 1
2 | 2
mods_alunos
nInterno | codDisc | numero
-------- | -------- | ------
11 | 1 | 1
11 | 1 | 2
11 | 1 | 3
11 | 2 | 1
12 | 2 | 2
通过这个例子我想要的是一个查询给我(codDisc 2,numero 2)当我问什么模块是学生11失踪
答案 0 :(得分:1)
您需要在Student表中工作,而不是链接表。试试这个:
select s.Id, m.codDisc, m.numero
from student s
cross join modulos m
where not exists(select *
from mods_alunos ma
where ma.codDisc = m.codDisc
and ma.numero = m.numero
and ma.nInterno = s.Id)
student
是您的学生表,而s.Id是您的学生证
答案 1 :(得分:0)
更新:`MySQL不支持EXCEPT。
<击>
只需使用EXCEPT
:
select coddisc, numero from modulos
except
select coddisc, numero from mods_alunos where ninterno = 123;
NOT IN
会有一个替代方案,虽然稍微复杂一些,所以我按照上面提到的EXCEPT
进行操作。
击>
select coddisc, numero from modulos
where (coddisc, numero) not in
(select coddisc, numero from mods_alunos where ninterno = 123);
答案 2 :(得分:0)
您可以这样做:
SELECT * FROM modulus WHERE codeDisc NOT IN(SELECT codeDisc FROM mods_alunos WHERE nInterno=?) AND numero NOT IN (SELECT numero FROM mods_alunos WHERE nInterno=?