Postgresql:多边条件下的一对多关系

Postgresql: One-To-Many Relationship With Multiple Conditions On The Many Side

我有一个学生 table,其中包含以下列

id
student_name

和课程table

id
student_id  //a foreign key
course_name
credits

是一对多的关系(一个学生可能有多门课程)。

我想列出所有拥有这 2 门课程的学生

first course:   course_name -> math    , credit -> 5
second course:  course_name -> history , credit -> 3

请注意每个学生至少要修这两门课。

我可以通过参加课程 table 两次(第一门课程一次,第二门课程一次)获得我想要的东西,但如果我想再添加一门课程,我需要再加入一次。

所以你能指导我另一种方法吗?

这是否解决了您的问题?我计算了您预期课程的所有出现次数,总和必须为 2.

demo:db<>fiddle

SELECT
    s.id
FROM students s
JOIN courses c
ON c.student_id = s.id
GROUP BY s.id
HAVING SUM(
    ((c.course_name = 'math' AND c.credits = 5)
    OR
    (c.course_name = 'history' AND c.credits = 3))::int
) = 2

您可以使用带有 FILTER 子句的 COUNT() 作为 SUM(condition::int) 的替代方法:

demo:db<>fiddle

HAVING COUNT(*) FILTER (WHERE
    (c.course_name = 'math' AND c.credits = 5)
    OR
    (c.course_name = 'history' AND c.credits = 3)
) = 2