Mysql 自行加入以获取普通学生的教师列表

Mysql 自行加入以获取普通学生的教师列表,mysql,sql,node.js,join,Mysql,Sql,Node.js,Join,我正在使用Express.js在Node.js中编写后端API 在其中一个API中,我需要返回给定教师列表中常见的学生列表 例如,如果 老师1教汤姆、杰瑞和埃德。 老师2教艾德、艾迪和杰瑞。 教师3教Ed、Edd和Eddy。 API接收教师列表的输入[Teacher1、Teacher2、Teacher3]。那么输出应该是[Ed],因为它是三位老师之间唯一的普通学生 这是注册表,它定义了教师和学生之间的联系 id | teacher_email | student_email |

我正在使用Express.js在Node.js中编写后端API

在其中一个API中,我需要返回给定教师列表中常见的学生列表

例如,如果

老师1教汤姆、杰瑞和埃德。 老师2教艾德、艾迪和杰瑞。 教师3教Ed、Edd和Eddy。 API接收教师列表的输入[Teacher1、Teacher2、Teacher3]。那么输出应该是[Ed],因为它是三位老师之间唯一的普通学生

这是注册表,它定义了教师和学生之间的联系

id | teacher_email    | student_email       | valid |
41 | Tom@gmail.com    | May@gmail.com       |     1 |
42 | Tom@gmail.com    | jerry@gmail.com     |     1 |
43 | Tom@gmail.com    | Kestov@gmail.com    |     1 |
44 | Toni@gmail.com   | hdjh@kd.com         |     1 |
58 | larry@gmail.com  | jerry@gmail.com     |     1 |
59 | gerrad@gmail.com | jerry@gmail.com     |     1 |
60 | gerrad@gmail.com | Kestov@gmail.com    |     1 |
61 | gerrad@gmail.com | Katrin@gmail.com    |     1 |
62 | gerrad@gmail.com | Piniyara@gniail.com |     1 |
63 | gerrad@gmail.com | Ritz@gmail.com      |     1 |
64 | gerrad@gmail.com | Taz@gmail.com       |     1 |
65 | gerrad@gmail.com | Fensuk@gmail.com    |     1 |
66 | gerrad@gmail.com | Joe@gmail.com       |     1 |
67 | gerrad@gmail.com | Mustafa@gmail.com   |     1 |
69 | Tom@gmail.com    | Fensuk@gmail.com    |     1 |
70 | Tom@gmail.com    | Taz@gmail.com       |     1 |
我试着写一个自连接查询,但它给出了输入中所有教师的所有学生。这是:

  const commonStudentsForTeachersQueryString = "SELECT a.student_email "+
  "FROM register a, register b "+
  "WHERE b.teacher_email=a.teacher_email "+
  "AND "+
  "a.teacher_email in (?) "+
  "AND "+
  "a.valid=? "+
  "GROUP BY a.student_email";
虽然,让每个老师的所有学生都在一个循环中并与他们相交的备选方案是存在的,但这并不是最优的。我只想使用一个查询来获得一个教师列表中的普通学生


是供参考的GitHub回购协议。

为此,您可以使用聚合和have:

select r.student_email
from register r
where r.teacher_email in (?, ?, ?)
group by r.student_email
having count(distinct teacher_email) = 3;
这是因为——至少在理论上——一个学生可以在两个不同的班级里有同一个老师

3是需要匹配的教师人数

编辑:

另一种方法使用intersect:

这个查询有效:

SELECT a.student_email FROM register a JOIN register b ON a.teacher_email = b.teacher_email WHERE a.teacher_email IN (?) And a.valid=1 GROUP BY a.student_email HAVING COUNT(DISTINCT a.teacher_email)=?

前者是教师的电子邮件ID,其大小与后者相同。

Hey@Gordon,谢谢。我尝试了这个查询,我得到了所有不常见的学生。所以和期望的结果正好相反。@HarshVardhan。你误解了结果。这个查询无法返回三个学生中不常见的学生。我再次检查了。您可以在这里看到结果。我尝试了intersect查询,但是我得到了一个ER_PARSE_错误:嘿@Gordon,刚刚知道我们不能在MySQL中使用intersect。
SELECT a.student_email FROM register a JOIN register b ON a.teacher_email = b.teacher_email WHERE a.teacher_email IN (?) And a.valid=1 GROUP BY a.student_email HAVING COUNT(DISTINCT a.teacher_email)=?