现在我有下表:
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