问题描述
我尝试使用jpql从学生和 class_student 表中获取班级ID。
我给一个像('name1','name2','name5')
这样的学生的学生名单,然后,如果这个名单分配给班级,那么我将获得班级ID(班级ID = 2)。
注意:列表是唯一的,这意味着该列表仅在一个类别中。
CREATE DATABASE test;
USE test;
CREATE TABLE CLASS
( ID BIGINT NOT NULL PRIMARY KEY,NAME VARCHAR(255) NOT NULL
) CHARSET = utf8mb4;
CREATE TABLE STUDENT
( ID BIGINT NOT NULL PRIMARY KEY,NAME VARCHAR(255) NOT NULL,constraint UK_NAME
unique (NAME)
)CHARSET = utf8mb4;
CREATE TABLE CLASS_STUDENT
(ID BIGINT NOT NULL PRIMARY KEY,CLASS_ID BIGINT NOT NULL,STUDENT_ID BIGINT NOT NULL,CONSTRAINT FK_STUDENT
FOREIGN KEY (STUDENT_ID) REFERENCES STUDENT (ID),CONSTRAINT FK_CLASS
FOREIGN KEY (CLASS_ID) REFERENCES CLASS (ID)
)CHARSET = utf8mb4;
INSERT INTO CLASS (ID,name)
VALUES (1,'class1'),(2,'class2'),(3,'class3');
INSERT INTO STUDENT (ID,'name1'),'name2'),'name3'),(4,'name4'),(5,'name5');
INSERT INTO CLASS_STUDENT (ID,CLASS_ID,STUDENT_ID)
VALUES (1,1,1),2),3),4),2,(6,(7,5),(8,3,(9,(10,(11,5);
解决方法
这是一个关系划分问题。您可以使用聚合和having
子句进行过滤。
select cs.class_id
from class_student cs
inner join student s on s.id = cs.student_id
where s.name in ('name1','name2','name3')
group by cs.class_id
having count(*) = 3
join
引入每个班级的学生,而where
子句过滤器针对我们感兴趣的三个学生。然后,我们按班级分组,并保留包含三行的组(每个学生一个)。
修改:
如果您要让这三个学生成为而没有其他的课程,则:
select cs.class_id
from class_student cs
inner join student s on s.id = cs.student_id
where s.name in ('name1','name3')
group by cs.class_id
having sum(case when s.name in ('name1','name3') then 1 else 0 end) = 3
and sum(case when s.name not in ('name1','name3') then 1 else 0 end) = 0