sql - SQL 查询 - 匹配 5 中至少 4 个值的条件
问题描述
我是新手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
照片图
解决方案
If I understand well (though I am not 100% sure), your requirements include: 1. Select "groups" that match at least 4 of 5 given "subjects". 2. Don't include "groups" that match less than 4 of the 5 given "subjects".
For that you can run the following query:
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;
Adding to that, subject_schedule
seems to be referring to sessions
. At the same time, groups
also refers to sessions
.
That can lead to problems in case that data is not consistent. For that reason I am not including 'sessions' in my query as the other tables have all the information needed for your use case.
I have created an example model of your schema to test that query (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
);
Hope it helps.
推荐阅读
- ruby-on-rails - 对危险方法爆炸的规则感到困惑
- kubernetes-apiserver - preStop hook inside pod using K8s API
- traefik - Traefik v2 Middlewares not being detected
- c# - 无法从 DataTable 中选择 DataRow
- python - How to load a comment form in DetailView?
- html - How to set different td sizes with inputs in them?
- android - Error inflating class androidx.constraintlayout.widget.ConstraintLayout in Android 4
- css - How to change background color of active Navigation Tab?
- reactjs - observable catchError after request failure (axios/redux)
- batch-file - Unknown "missing operand" comment in Batch program