【问题标题】:Can sub-query be avoided in this query?在这个查询中可以避免子查询吗?
【发布时间】:2020-08-30 11:34:57
【问题描述】:

我的数据库中的三个表如下:

  • 教师桌
    teachers: teacher_id, teacher_name
  • 学生桌
    students: student_id, student_name
  • 教师-学生有一个多对多的关系,因此他们有一个专用表as per this answer:
    students_volunteers: teacher_id (FK), student_id(FK)

现在假设一位老师不能上课,所以他/她发布了一个替代请求,所以我们只想向那些有相同学生的老师发送通知。所以我写了相同的 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 或其他东西来提高性能.....

【问题讨论】:

  • 不应该有性能问题。您可以尝试任何其他方法,但此查询将提供同等甚至更好的性能。
  • 一些针对 many:many 表的一般性能提示:mysql.rjweb.org/doc.php/…

标签: mysql sql subquery query-optimization where-clause


【解决方案1】:

你可以试试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
    )

或者,这里有一个带有 self-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

【讨论】:

    猜你喜欢
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    相关资源
    最近更新 更多