我有两个表:Students (id, fname, lname)
和 Registrar (id, student_id, class_id)
。我教一个类(class) ID 为 99 的类(class)。我想找到类(class)中的所有学生,并列出这些学生和他们正在上的所有其他类(class)。我可以执行以下操作:
SELECT s.fname, s.lname, r.class_id FROM
Students AS s JOIN Registrar AS r ON s.id = r.student_id WHERE
r.student_id IN
(SELECT student_id FROM Registrar WHERE class_id = 99);
这行得通,但速度很慢。我对此没有太多经验(正如我的标题所暗示的,我不知道这叫什么),但我猜这是一个相当普遍的问题。任何指向正确方向的指示都是最受欢迎的。
最佳答案
这应该有效。在 class_id = 99
条件下加入 registar 表一次,然后在没有 class_id
限制的情况下再次加入该学生的所有类(class)。
select s.fname, s.lname, r2.class_id
from students s
inner join registrar r
on s.id = r.student_id
and r.class_id = 99
inner join registrar r2
on s.id = r2.student_id;
在 registrar 表中使用索引 (student_id, class_id)
,在学生表中使用 id
,这应该非常快。
基于评论 可能会重复上课 - 我们可以分组以摆脱这些:
select s.fname, s.lname, r2.class_id
from students s
inner join registrar r
on s.id = r.student_id
and r.class_id = 99
inner join registrar r2
on s.id = r2.student_id
group by s.id, r2.class_id
这在某种程度上滥用了 mysql 对 group by 的处理,但没关系,因为 fname
和 lname
在每个组中的每一行中都是相同的
关于mysql - 如果(作为一个组)满足条件,则获取表中的每一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29980605/