如果存在多个行,则过滤PostgreSQL查询

时间:2018-07-16 15:20:31

标签: postgresql

现在我有下表:

students      |       classes       | 
-------------------------------------
Ally          |       Math          |        
Ally          |       English       |        
Ally          |       Science       |       
Kim           |       Math          |        
Kim           |       English       |   

我目前正在构建高级搜索功能,您可以在其中按班级搜索并返回拥有这些班级的学生。我想构建一个查询,该查询将返回在“班级”列中具有数学,英语和科学的学生,因此在上述情况下,由于她符合三个班级的条件,因此只会返回其中包含Ally的行。

如果有人有任何建议,我将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:1)

我已经稍微重命名了您的表格,但是部分原因是我很懒。这是我想出的:

select student from studentclasses where
  class in ('Math', 'English', 'Science')
group by student
having count(*) = 3;

请参见db-fiddle

这个想法是获取与您的搜索相匹配的所有学生类行(基本上是一个OR),并按学生对其进行分组,以便我们可以通过having子句进行限制。我们可以在这里使用>=,但是如果特定学生的人数超过3,我们搞砸了IN :)如果少于3,则我们缺少一个班级,因此找不到所有班级给那个学生。

唯一的警告是:

  • 我假设您使用的是学生证,而不仅仅是名字,并且名字的目的只是为了使我们更容易阅读,否则重复的话会很多。
  • 对于特定学生,没有给定课程的重复项。也就是说,如果Kim两次进入《科学》杂志,那么得出3分。在这种情况下,您需要在那儿的某个地方使用DISTINCT。