我尝试使用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, name)
VALUES (1, 'name1'),
(2, 'name2'),
(3, 'name3'),
(4, 'name4'),
(5, 'name5');
INSERT INTO CLASS_STUDENT (ID, CLASS_ID, STUDENT_ID)
VALUES (1, 1, 1),
(2, 1, 2),
(3, 1, 3),
(4, 1, 4),
(5, 2, 1),
(6, 2, 3),
(7, 2, 5),
(8, 3, 1),
(9, 3, 3),
(10, 3, 4),
(11, 3, 5);
答案 0 :(得分:0)
这是一个关系划分问题。您可以使用聚合和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', 'name2', 'name3')
group by cs.class_id
having sum(case when s.name in ('name1', 'name2', 'name3') then 1 else 0 end) = 3
and sum(case when s.name not in ('name1', 'name2', 'name3') then 1 else 0 end) = 0