【问题标题】:find the common Class ID for a list of students查找学生列表的通用班级 ID
【发布时间】:2021-01-15 12:24:30
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    这是一个关系划分问题。您可以使用聚合和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
    

    【讨论】:

    • 是的,但在您的查询中,它会返回一个结果。我不想,因为没有类具有指定的列表('name1'、'name2'、'name3')。有列表的类('name1','name2','name3','name4')。
    • @Emadoo:所以你想要有这三个学生而没有其他学生的班级?
    • 是的,它总是只在一个类中,我的意思是,指定的列表,例如('name1', 'name2', 'name3') 仅在一个类中,不在其他类中。和其他例如 ('name1', 'name2', 'name3', 'name4') 也是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    相关资源
    最近更新 更多