我有两个mysql表:
id, name, age
,其中name, age, teacher_id
是指定学生的教师的ID。现在,教师之间的负担应该是平均分配的。每当新学生被添加到系统中时,我需要为其分配一个最不忙的教师,即分配给它的学生人数最少。
有这么快的方法吗?最初,我以为我可以使用teacher_id
并按计数对其进行排序。但是,这遗漏了没有任何学生分配给他们的教师。
如果我们正在使用联接,如果学生表有100万行,性能如何?
答案 0 :(得分:1)
你只需要一个外部联接来包括没有学生的教师。
select t.id, t.name
from teacher t
left join student s on t.id = s.teacher_id
group by t.id
order by count(s.name)
limit 1
你可以使用非规范化(每个教师预先计算出的学生数量的专栏),然而,这是一个坏习惯,如果它不是真的不可避免,我不会推荐它。
答案 1 :(得分:1)
如果你想要一个非常快速的方式"这样做,我会建议一个小的重新设计。
实施触发器以维持所有教师的当前学生人数。这将是一个新列,{。1}},比方说。
在学生计数上加上一个索引,然后执行:
student_count
我不是触发器的忠实粉丝,但是当它们有用时,它们确实非常有用。您遇到性能问题,需要沿层次结构聚合数据。您需要学生select t.*
from teachers t
order by student_count asc
limit 1;
,insert
和update
的触发器。