问题描述
数据库中的三个表如下:
- 教师桌
teachers: teacher_id,teacher_name
- 学生桌
students: student_id,student_name
- 师生之间存在多对多关系,因此他们有专用的表as per this answer:
students_volunteers: teacher_id (FK),student_id(FK)
现在,假设一位老师不能上课,所以他/她发布了一个replace_request,因此我们只想向那些共同拥有相同学生的老师发送通知。因此,我编写了相同的SQL查询:
SELECT disTINCT students_volunteers.v_id_sv
FROM students_volunteers
WHERE students_volunteers.s_id_sv IN (SELECT students_volunteers.s_id_sv
FROM students_volunteers
WHERE v_id_sv = 3)
AND students_volunteers.v_id_sv <> 3
它工作正常,除了它有一个子查询,由于性能问题,它不理想。
所以我想知道我们是否可以使用一些JOIN
或其他东西来提高性能.....
解决方法
您可以尝试使用not exists
:
SELECT DISTINCT teacher_id
FROM students_volunteers sv
WHERE
teacher_id <> 3
AND EXISTS (
SELECT 1
FROM students_volunteers sv1
WHERE sv1.teacher_id = 3 AND sv1.student_id = sv.student_id
)
或者,这是一种使用自我join
的方法:
SELECT DISTINCT sv.teacher_id
FROM students_volunteers sv
INNER JOIN students_volunteers sv1
ON sv1.teacher_id <> sv.teacher_id
AND sv1.student_id = sv.student_id
WHERE sv1.teacher_id = 3