如果存在多行,则筛选postgresql查询



现在我有下表:

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

我目前正在构建一个高级搜索功能,您可以按班级进行搜索,并返回拥有这些班级的学生。我想建立一个查询,返回classes列中有Math、English和Science的学生,所以在上面的情况下,它只返回其中有Ally的行,因为她符合三个classes标准。

如果有人有什么建议,我会非常感激,谢谢。

我稍微重命名了您的表等等,但部分原因是我很懒。以下是我的想法:

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

查看db fiddle

我们的想法是获取所有与搜索匹配的学生类行(基本上是OR(,并按学生分组,这样我们就可以通过have子句进行限制。我们可以在这里使用>=,但如果某个特定学生的计数超过3,我们就把IN搞砸了:(如果少于3,那么我们就少了一个类,所以并没有找到该学生的所有类。

唯一需要注意的是:

  • 我假设你使用的是学生证,而不仅仅是名字,名字只是为了让我们更容易阅读,否则重复的地方会很多
  • 对于某个特定的学生,不存在给定班级的副本。也就是说,如果金上了两次《科学》,那么就会得出3。在这种情况下,您需要在某个地方使用DISTINCT

最新更新