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

时间:2020-09-29 20:35:36

标签: sql hibernate jpql having-clause relational-division

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

1 个答案:

答案 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
相关问题