微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

查找学生列表的通用班级ID

如何解决查找学生列表的通用班级ID

我尝试使用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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。