簡體   English   中英

SQL 查詢 - 匹配至少 5 個值中的 4 個值的條件

[英]SQL Query - condition to match at least 4 values from 5

我是SQL新手,我需要幫助編寫查詢(附照片圖)

概括:

IG School 系統,要求學生在特定的學習時段中選擇 5 個學習科目,那么查詢結果應該是:

1) 已經有所選科目的可用組;

或者

2) 至少符合 4 個所選科目的組,並且還返回沒有匹配的科目。

表格:

Sessions -----> Like Semesters
Groups   -----> Like classes that has schedule

我已經寫了一個查詢,但對於只有 4 個匹配主題的可用組沒有條件,只返回匹配所有 5 個主題的組(問題),如下所示:

    SELECT Group_Subjects.Group_ID, Groups.Name as Groups_Name,  Subject_Schedule.ID as Subject_Schedule_ID,Subjects.ID Subjects_ID,
    Subjects.Name AS Subjects_Name,Sessions.Name AS Sessions_Name
    FROM   Groups 
    INNER JOIN Group_Subjects ON Groups.ID = Group_Subjects.Group_ID 
    INNER JOIN Subject_Schedule ON Group_Subjects.Subject_Schedule_ID = Subject_Schedule.ID 
    INNER JOIN Subjects ON Subject_Schedule.Subject_ID = Subjects.ID
    INNER JOIN Sessions ON dbo.Groups.Session_ID = dbo.Sessions.ID   
    where Groups.Session_ID=13 and  Subjects.ID in (16,117,125,126,127)
    order by Group_Subjects.Group_ID,Subjects_Name

照片圖

這里

您可以將選定組的結果分組(分組依據)並按主題的出現次數(計數(主題)> = 4)進行過濾,如下所示:

SELECT Group_Subjects.Group_ID, Groups.Name as Groups_Name,  Subject_Schedule.ID as Subject_Schedule_ID,Subjects.ID Subjects_ID,
    Subjects.Name AS Subjects_Name,Sessions.Name AS Sessions_Name
    , **count (Subjects.ID)** 
    FROM   Groups 
    INNER JOIN Group_Subjects ON Groups.ID = Group_Subjects.Group_ID 
    INNER JOIN Subject_Schedule ON Group_Subjects.Subject_Schedule_ID = Subject_Schedule.ID 
    INNER JOIN Subjects ON Subject_Schedule.Subject_ID = Subjects.ID
    INNER JOIN Sessions ON dbo.Groups.Session_ID = dbo.Sessions.ID   
    where  Subjects.ID in (16,117,125,126,127)
    **group by** Group_Subjects.Group_ID, Groups.Name as Groups_Name,  Subject_Schedule.ID as 
    Subject_Schedule_ID,Subjects.ID Subjects_ID,
    Subjects.Name AS Subjects_Name,Sessions.Name AS Sessions_Name
    **having count (Subjects.ID) >= 4** 

如果我理解得很好(盡管我不是 100% 確定),您的要求包括: 1. 選擇與 5 個給定“主題”中的至少 4 個匹配的“組”。 2. 不要包括匹配少於 5 個給定“主題”中的 4 個的“組”。

為此,您可以運行以下查詢:

SELECT 
    gr.name, sub.name
FROM
    groups           gr  JOIN
    group_subject    gs  ON gs.group_id = gr.id JOIN
    subject_schedule ss  ON ss.id = gs.subject_schedule_id JOIN
    subject          sub ON sub.id = ss.subject_id  
WHERE
    EXISTS (
        SELECT 
            g.id, COUNT(*) num_subjects
        FROM
            groups           g  JOIN
            group_subject    gs  ON gs.group_id = g.id JOIN
            subject_schedule ss  ON ss.id = gs.subject_schedule_id JOIN
            subject          sub ON sub.id = ss.subject_id  
        WHERE
            sub.id IN ('A', 'B', 'C', 'D', 'E') AND
            g.id = gr.id
        GROUP BY gr.id
        HAVING num_subjects >=4
    )
ORDER BY 
    gr.name, sub.name;

除此之外, subject_schedule似乎指的是sessions 同時, groups也指sessions
如果數據不一致,這可能會導致問題。 出於這個原因,我沒有在我的查詢中包含“會話”,因為其他表包含您的用例所需的所有信息。

我已經創建了一個模式的示例模型來測試該查詢(MySQL):

CREATE TABLE groups (
    id                   VARCHAR(5) PRIMARY KEY,
    name                 TEXT,
    session_id           VARCHAR(7) REFERENCES sessions
);
CREATE TABLE group_subject (
    id                   INTEGER PRIMARY KEY,
    group_id             VARCHAR(5) REFERENCES groups,
    subject_schedule_id  INTEGER REFERENCES subject_schedule,
    description          TEXT
);
CREATE TABLE subject_schedule (
    id                   INTEGER PRIMARY KEY,
    name                 TEXT,
    session_id           VARCHAR(7) REFERENCES sessions,
    subject_id           VARCHAR(1) REFERENCES subject
);
CREATE TABLE subject (
    id                   VARCHAR(1) PRIMARY KEY,
    name                 TEXT
);
CREATE TABLE sessions (
    id                   VARCHAR(7) PRIMARY KEY,
    name                 TEXT
);

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM