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
.
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)
的替代方法:
HAVING COUNT(*) FILTER (WHERE
(c.course_name = 'math' AND c.credits = 5)
OR
(c.course_name = 'history' AND c.credits = 3)
) = 2
我有一个学生 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
.
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)
的替代方法:
HAVING COUNT(*) FILTER (WHERE
(c.course_name = 'math' AND c.credits = 5)
OR
(c.course_name = 'history' AND c.credits = 3)
) = 2