![](/img/trans.png)
[英]SQL query to return columns and values which match part of a where condition
[英]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.